Java Tomcat为同一会话创建新线程

Java Tomcat为同一会话创建新线程,java,web-applications,tomcat,sessionid,stripes,Java,Web Applications,Tomcat,Sessionid,Stripes,我有一个webapp,它使用条纹和apacheshiro库来保证安全性 在我的本地Windows Tomcat 6.0.33安装中,一切正常。然而,当我在我的主机DailyRazor上运行Linux上Tomcat 6.0.16上的应用程序时,我可以看到Tomcat周期性地为同一用户/会话生成一个新线程,因此用户正在丢失其凭据并被要求再次登录 在Jetty下运行时,我在我的开发盒上也注意到了这一点 我不认为这是一个不活动超时的问题,因为我给webapp的点击是连续的,除了不同的次要版本之外,Tom

我有一个webapp,它使用条纹和apacheshiro库来保证安全性

在我的本地Windows Tomcat 6.0.33安装中,一切正常。然而,当我在我的主机DailyRazor上运行Linux上Tomcat 6.0.16上的应用程序时,我可以看到Tomcat周期性地为同一用户/会话生成一个新线程,因此用户正在丢失其凭据并被要求再次登录

在Jetty下运行时,我在我的开发盒上也注意到了这一点

我不认为这是一个不活动超时的问题,因为我给webapp的点击是连续的,除了不同的次要版本之外,Tomcat配置中是否存在一些可能不同的东西


或者,是否有一种简单的方法来调试会话信息(因为它没有出现在我的URL中)?

只是为了让它比在注释中更清楚:每个HTTP请求都将由任意线程处理。Tomcat(和其他应用服务器)使用一个线程池,从池中选择一个线程,执行请求,然后将线程返回到池中

HTTP会话与线程完全正交:来自同一会话的多个请求可能由不同的线程处理。一个线程执行来自多个会话的请求。池中的并行会话通常比线程多得多。最后,您可能有两个线程为同一个会话执行两个请求。这意味着存储在会话中的对象应该是线程安全的,或者应该使用同步机制来访问存储在会话中的非线程安全对象


此外,给定浏览器的多个帧或选项卡共享同一HTTP会话。如果启动一个不同的浏览器(例如,除了Firefox之外的Chrome),或者如果在另一台机器上使用浏览器,那么您将有一个不同的会话。或者它启动一个新线程来处理一个新请求。如果是后者,那是意料之中的。您是否将凭据存储在ThreadLocal中,并希望它在会话中始终使用相同的线程?您可以通过正常记录来转储会话ID—但您说您已经知道它是相同的会话,您怎么知道?用户的会话可以跨任意数量的线程存在。@JBNizet收到请求时我正在记录,对于来自同一浏览器窗口的不同请求,这可能不同。我相信Shiro将凭证存储在ThreadLocal中,因为有一个静态调用来获取当前主题,难道我不能保证线程将与会话ID解析吗?…这样说,我觉得我已经知道了answer@DaveNewton确实是这样吗?…我假设线程是会话的私有线程,有关于这个的文档吗?@JamesB每个新请求都将由任意线程处理;会话与线程无关。您需要什么样的文档?TC文档声明“每个传入请求在请求期间都需要一个线程”。仅仅因为某些东西将数据存储在
ThreadLocal
中,并不意味着信息不会存储在每个请求的开始处或附近。我从您在评论中所说的话中已经猜到了这一点。如果我避开这个问题,看看有人会如何实现像Tomcat这样的东西,这是非常有意义的。谢谢你的回答,我想我要把我的应用程序翻过来,使用Shiro servlet来保证安全性,然后找出如何将stripes框架嵌入其中,而不是从stripes拦截器调用Shiro。