【问题标题】:jsessionid as path parameter not working in Tomcatjsessionid 作为路径参数在 Tomcat 中不起作用
【发布时间】:2018-02-03 18:26:24
【问题描述】:

我正在使用 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>

我有一个桌面应用程序,它登录到网络应用程序并建立一个会话。作为对用户操作的响应,它调用浏览器中的 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 文档中没有看到任何表明这不应该工作的内容,而且我完全没有想法。

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

【问题讨论】:

    标签: java session tomcat servlets jsessionid


    【解决方案1】:

    这是我如何让它工作的:

    在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 重写已启用)。

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 2018-10-20
      相关资源
      最近更新 更多