Java HttpSession可以在运行时更改吗?

Java HttpSession可以在运行时更改吗?,java,multithreading,session,tomcat,request,Java,Multithreading,Session,Tomcat,Request,我有两台服务器。 服务器A有一个cron系统,它给出了一个触发器要求,通过servlet调用服务器B 在服务器B中,当接收到服务器A的调用时,我将服务器信息存储在HttpSession上,然后启动一个新线程,以便释放服务器A 我发现,Think logs,在一些情况下,当服务器B中的线程到达HttpSession时,之前设置的值是不同的。它们不是null或空白,它们有实际值,但不是我输入的值 服务器A每5分钟发出30个通知。这意味着我将有几个并发线程 为什么HttpSession被另一个线程覆盖

我有两台服务器。 服务器A有一个cron系统,它给出了一个触发器要求,通过servlet调用服务器B

在服务器B中,当接收到服务器A的调用时,我将服务器信息存储在HttpSession上,然后启动一个新线程,以便释放服务器A

我发现,Think logs,在一些情况下,当服务器B中的线程到达HttpSession时,之前设置的值是不同的。它们不是null或空白,它们有实际值,但不是我输入的值

服务器A每5分钟发出30个通知。这意味着我将有几个并发线程


为什么HttpSession被另一个线程覆盖?

Servlet规范V3.0的第2.3.3.4节说

如果应用程序创建的线程使用托管容器 对象,例如请求或响应[或会话]对象,这些对象 只能在对象的生命周期[…]内访问

HttpSession
对象当然是容器管理的对象,但是Servlet规范没有明确定义它们的生命周期。然而,似乎合理的是考虑生命周期结束时,会话已被无效,无论是显式还是超时,并且没有属于该会话的请求正在被服务。在此之后,如果继续访问会话对象,则所有下注都将取消。特别是,允许容器缓存和重用托管对象,包括会话对象

如果您的服务器A不参与会话跟踪,则每个请求都将分配给一个新会话,并且每个请求的生存期都是一个超时时间。在这种情况下,您可以考虑设置[默认]超时足够长的时间,以确保会话在一次计算过程中不会超时(但见下文)。另一方面,如果服务器A确实参与会话跟踪,则会话对象将在每次请求时打开以进行修改


然而,无论服务器A是否参与会话跟踪,对于应用程序线程(例如您手动启动以访问容器管理对象的线程)来说,这都是一种糟糕的形式。最好使用不同的机制向他们提供数据。

首先为什么要使用会话?为什么不将线程所需的信息传递给Runnable的构造函数呢?当用户登录系统时,我们会将他的凭据保存在http会话中。当服务器A发出通知时,它携带身份验证,因此它充当登录名。这是我们在HttpSession中注册的信息。但是,在某些情况下,我注意到用户信息发生了变化。根据您的回答,我询问了负责当前架构的程序员是否需要在会话中存储信息。他的回答基本上是,“每个请求都会创建一个新的会话。因此不会重用HttpSession元素。”然而,在这篇文章之后进行的调查却证明了相反的结果。正如您所说,会话对象正在被重用。当进入servlet时。我确定会话已填充。现在我有这个问题要解决。谢谢你的回答。感激的