我需要在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中更改此行为。
答案 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的注销处理程序所做的。