Tomcat为每个请求创建一个新会话

时间:2010-11-24 20:18:37

标签: ajax model-view-controller spring session tomcat

我现在正在解决这个问题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表现得像这样呢?

我真的很绝望,所以任何想法/提示/解决方案都很受欢迎。

非常感谢

3 个答案:

答案 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);