JSESSIONID cookie 有 '.node0' 后缀,而服务器端 sessionID 没有

JSESSIONID cookie has '.node0' postfix while the server side sessionID doesn't

我正在使用 shiro 进行会话管理。当我在服务器端获取 sessionID 时,它是这样的:

node0sicwaberf0z59o8qpehfpasf6

但是,当我在浏览器中检查 JSESSIONID 时,该值保存为:

node0sicwaberf0z59o8qpehfpasf6.node0

这个 .node0 到底是什么,为什么要附加到 sessionID 的末尾

另外值得一提的是,我使用 jetty 9 作为我的网络服务器。

这是一个 Jetty 会话 ID,您可以在这里阅读更多相关信息: http://jetty.4.x6.nabble.com/Some-questions-regarding-upgrade-9-3-gt-9-4-td4966096.html

Jetty session id (9.3 and onwards) 的格式是worker name (e.g. node0), 一个随机生成的唯一ID (e.g. 123x0dsf) 和.worker name (e.g. .node0) 根据org.eclipse.jetty.server.session.DefaultSessionIdManager.

检查 DefaultSessionIdManager#renewSessionIdDefaultSessionIdManager#getExtendedId

我知道已经晚了,但也许它会对某些人有所帮助。

我正在使用 maven-jetty-plugin (9.4.6.v20170531),最终遇到类似的问题 - Session.getId() returns 一个值,但 ServletContainer 实际设置了 JSESSIONID cookie至 value+'.node0'.

我没有以任何方式使用集群,也没有进行任何配置。这是码头服务器的默认行为。

我通过将以下行添加到 jetty-env.xml 来设法删除 .node 后缀:

<Get name="sessionHandler">
  <Call name="getServer" id="srv"></Call>
  <Set name="sessionIdManager">
    <New class="org.eclipse.jetty.server.session.DefaultSessionIdManager">
        <Arg><Ref refid="srv" /></Arg> 
        <Set name="workerName" type="String"></Set>
    </New>
  </Set>
</Get>

这里是相关的source code of DefaultSessionIdManager

Session 管理在 Jetty 9.4 中进行了重大改革。 当我将码头从 9.3.25.x 升级到 9.4.15.x 时,我遇到了同样的问题。由于在 JSESSIONID 中添加了工作人员名称,在我的应用程序中,发生在 Jetty 之外的一些 header 验证开始失败。 由于我只有一个码头节点,我选择从 session ID 中删除节点 ID。 我设法通过向 start.ini

添加以下行来删除 .node 后缀
jetty.sessionIdManager.workerName=
etc/sessions/id-manager.xml

默认情况下,Jetty 9.4.x 将在启动时使用默认设置实例化 DefaultSessionIdManager 和 HouseKeeper 的单个实例。以上配置会覆盖默认配置中的 workerName。

Reference