jsessionid作为路径参数在Tomcat中不起作用

时间:2018-02-03 18:26:24

标签: java session tomcat servlets jsessionid

我正在使用Tomcat 7.0.84,而我的Web应用程序使用Servlet 3.0部署描述符。 web.xml文件包含:

<session-config>
  <cookie-config>
    <name>JSESSIONID</name>
    <http-only>false</http-only>
  </cookie-config>
  <tracking-mode>URL</tracking-mode>
  <tracking-mode>COOKIE</tracking-mode>
</session-config>

我有一个桌面应用程序,它登录到Web应用程序并建立会话。响应用户操作,它在浏览器中调用URL。由于我希望浏览器使用相同的会话登录,因此我追加jsessionid路径参数,如下所示:

http://server/contextroot/path/;jsessionid=8BDF744802E7850D5AA4AB6535163504

我完全关闭浏览器,因此在生成URL时,不会发送以前的会话cookie。 (我的默认浏览器是chrome,我验证了这种情况。)

我也非常在代码中启用了URL跟踪模式,通过记录返回值 ServletContext.getEffectiveSessionTrackingModes.

我期待的是浏览器请求自动获取由; jsessionid参数指示的会话,但它没有发生。每次Tomcat在其响应中包含新的会话cookie。

此代码曾用于以前版本的Tomcat(可能是5.5)和servlet 2.3规范。我没有看到Servlet 3.0规范或Tomcat文档中的任何内容表明这不起作用,而且我完全没有想法。

有谁知道为什么这不能按预期工作?

1 个答案:

答案 0 :(得分:0)

以下是我如何使用它:

在web.xml中,我更改了

 <cookie-config>
    <name>JSESSIONID</name>
    <http-only>false</http-only>
  </cookie-config>

为:

 <cookie-config>
    <name>jsessionid</name>
    <http-only>false</http-only>
  </cookie-config>

这样会话cookie名称现在全部小写,并且与jsessionid路径参数的名称完全匹配。

它的另一种工作方式是将路径参数名称从jsessionid更改为JSESSIONID。这是因为,在Tomcat中,如果您明确地为会话cookie配置名称,它会将其用作用于传递会话ID的路径参数的名称。这似乎不符合Servlet 3.0规范的第7.1.3节,该规范说:

  

会话ID必须编码为URL字符串中的路径参数。   参数的名称必须是jsessionid。这是一个例子   包含编码路径信息的URL:

     

http://www.myserver.com/catalog/index.html;jsessionid=1234

但是,它确实符合第7.1.1节中的摘录:

  

如果Web应用程序为其会话跟踪配置自定义名称   cookie,相同的自定义名称也将用作URI的名称   参数如果会话ID在URL中编码(提供该URL)   重写已启用)。