gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:59:03 29 4
gpt4 key购买 nike

我有 2 个服务器。服务器A有一个cron系统,给定触发需求,通过servlet调用服务器B

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

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

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

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

最佳答案

Servlet 规范 v 3.0 的第 2.3.3.4 节说,

If a thread created by the application uses the container-managed objects, such as the request or response [or session] object, those objects must be accessed only within the object’s life cycle [...].

HttpSession对象固然是容器管理的对象,但是Servlet规范并没有明确定义它们的生命周期。然而,当 session 已经失效时(无论是明确地还是超时)并且没有属于该 session 的请求得到服务时,考虑生命周期结束似乎是合理的。在那之后,如果您继续访问 session 对象,那么所有赌注都将取消。特别是,允许​​容器缓存和重用托管对象,包括 session 对象。

如果你的服务器A不参与session跟踪,那么每一个请求都会被分配到一个新的session中,每一个的生命周期都是一个单独的超时时间。在这种情况下,您可以考虑将 [default] 超时设置得足够长,以确保 session 在一次计算过程中不会超时(但请参见下文)。另一方面,如果您的服务器 A 确实参与了 session 跟踪,那么 session 对象将在每次请求时打开以进行修改。

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

关于Java HttpSession 可以在运行时更改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42935306/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com