在使会话无效时,不会更改JSESSIONID的值

时间:2014-05-14 19:37:34

标签: java tomcat spring-mvc tomcat7 jsessionid

我需要在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中更改此行为。

2 个答案:

答案 0 :(得分:2)

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

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

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

此问题与Cookie路径有关,而与域

无关

答案 1 :(得分:1)

假设您正在使用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的注销处理程序所做的。