我现在正在解决这个问题2天,我希望这里的任何人都有类似的问题和解决方案。
问题: 它是一个Spring MVC(2.5.6。)Web应用程序,它运行在Tomcat 6中。 当请求起始页面时,它将客户重定向到JSP页面(通过使用HTML的元刷新标记),该页面使用大量Ajax请求(Framework:Prototype)加载其内容。问题是Tomcat为每个AJAX请求创建一个新会话(大约67个会话)。 我的第一个想法是在加载起始页面之后存储会话Cookie,并且Ajax请求强制Tomcat创建新会话。我的方法是手工创建会话cookie,但这没有任何区别。 有趣的是,它可以在其他一些tomcat实例中运行,但不适用于集成测试所需的环境。在我看来,这是一个Tomcat配置问题。
在使用Firebug进行进一步调查后,我发现Tomcat为每个请求创建了一个新的Session,即使正确的JSESSIONID被转移到它(50B5EA0BCFE811C744CE9C1F9EDE0097):
Request Header 1:
Cookie JSESSIONID=F3206CBF2C961E125821FF22FA31A02D
Response Header 1:
Set-Cookie JSESSIONID=49E000B4D6880F4F94531AB9C78DB667; Path=/JOCA-Music-Portal JSESSIONID=50B5EA0BCFE811C744CE9C1F9EDE0097; Path=/JOCA-Music-Portal
Request Header 2:
Cookie JSESSIONID=50B5EA0BCFE811C744CE9C1F9EDE0097
Response Header 2:
Set-Cookie JSESSIONID=DCCA2D1B98D11223A6B8855800276E27; Path=/JOCA-Music-Portal
更新:进一步调查将问题隔离到Tomcat领域配置。我们使用JDBC Realm进行登录。当登录被取消激活时,只创建一个会话。 如果它被激活,Tomcat会创建无效/过期的会话,这就是为每个请求创建一个新会话的原因。但为什么Tomcat表现得像这样呢?
我真的很绝望,所以任何想法/提示/解决方案都很受欢迎。
非常感谢
答案 0 :(得分:3)
您可以尝试在客户端和服务器之间analyze the HTTP traffic。确保在请求和响应中正确设置了Cookie标头。
如果使用Firefox,您可以尝试使用Firebug进行调试。
答案 1 :(得分:2)
我们最近遇到了与我们正在开发的应用程序相同的问题。来发现,问题是Tomcat被修改以帮助防止会话固定攻击。默认情况下,会在身份验证时创建新的会话ID。这从6.0.21开始。查看上下文配置选项'changeSessionIdOnAuthentication'(tomcat bug / issue is https://issues.apache.org/bugzilla/show_bug.cgi?id=45255)。
答案 2 :(得分:0)
我们遇到了同样的问题,但在使用自定义EXTERNALSSO身份验证时。解决方案是在继承自org.apache.catalina.authenticator.AuthenticatorBase
:
super.setChangeSessionIdOnAuthentication(false);