我正在使用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文档中的任何内容表明这不起作用,而且我完全没有想法。
有谁知道为什么这不能按预期工作?
答案 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:
但是,它确实符合第7.1.1节中的摘录:
如果Web应用程序为其会话跟踪配置自定义名称 cookie,相同的自定义名称也将用作URI的名称 参数如果会话ID在URL中编码(提供该URL) 重写已启用)。