【问题标题】:Value of JSESSIONID is not changed on invalidating sessionJSESSIONID 的值在会话无效时不会更改
【发布时间】:2014-07-03 00:55:16
【问题描述】:

我需要在 context.xml 文件中将 JSESSIONID 的域更改为“.something.com”:

<Context path="/test" sessionCookiePath="/" sessionCookieDomain=".something.com" useHttpOnly="true" />

之后,当我执行 httpSession.invalidate() 会话被重置但 JSESSIONID 值不会改变。

我正在使用 Java 7、Spring MVC 和 Tomcat 7。我还尝试手动删除 JSESSIONID cookie,但似乎 Tomcat 或 Spring 不允许我更改其值。

这可能难以对我的系统进行故障排除。我想知道是否可以在 Spring 或 Tomcat 中更改此行为。

【问题讨论】:

  • 您能否扩展“会话已重置但 JSESSIONID 值未更改”您如何知道其重置以及如何检查 JSESSIONID 值?
  • 在我的应用程序中,当用户点击初始页面并且会话不是新的(即它有一些数据)时,会出现一条警告消息。我可以在浏览器的 cookie(chrome 开发工具)中看到 JSESSIONID 值

标签: java tomcat spring-mvc tomcat7 jsessionid


【解决方案1】:

我在Tomcat的文档中发现了问题:

"注意:一旦一个使用 sessionCookiePath="/" 的 Web 应用程序获得一个会话,同一主机中也配置了 sessionCookiePath="/" 的任何其他 Web 应用程序的所有后续会话将始终使用相同的会话 ID。这成立即使会话无效并创建了一个新会话。这使得会话固定保护更加困难,并且需要自定义的 Tomcat 特定代码来更改多个应用程序共享的会话 ID。"

来源:http://tomcat.apache.org/tomcat-7.0-doc/config/context.html

问题与 cookie 路径有关,与域无关

【讨论】:

  • 终于找到原因了,谢谢!我一直在指责 Spring Security 破坏了会话固定保护。
【解决方案2】:

假设您使用的是 Spring Security,您可以配置会话注销处理程序来为您删除 cookie。

...
<logout delete-cookies="JSESSIONID">
...

或者,在 Java 配置中,WebSecurityConfigurerAdapter

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            ...
            .logout()
                .deleteCookies("JSESSIONID");
    }

如果您没有使用 Spring Security,您可能可以在 Spring 现有的过滤器链中安装一个 Filter 对象,以删除会话已失效的传出请求中的 Set-Cookie 标头(或在您指定的任何条件下,在那一点)。无论如何,这或多或少是 Spring Security 的注销处理程序所做的。

【讨论】:

  • 我认为这个解决方案使用了 Spring Security。有没有办法只使用 Spring MVC 来做到这一点?
  • 我修改了答案以说明我将如何在 Spring Security 之外进行操作。要实现它,您需要一些非常基本的 servlet 过滤器和 HTTP 标头知识。
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 2015-11-24
  • 2017-02-27
  • 1970-01-01
  • 2013-01-07
相关资源
最近更新 更多