据我所知,Servlet 3 规范引入了异步处理特性。除此之外,这意味着同一个线程可以并且将被重用于处理另一个并发的 HTTP 请求。这不是革命性的,至少对于以前与 NIO 合作过的人来说。
无论如何,这导致了另一个重要的事情:没有ThreadLocal
变量作为请求数据的临时存储。因为如果同一线程突然成为不同 HTTP 请求的载体线程,请求本地数据将暴露给另一个请求。
所有这些都是我基于阅读文章的纯粹推测,我没有时间玩任何 Servlet 3 实现(Tomcat 7、GlassFish 3.0.X 等)。
所以,问题:
- 我是否正确地假设这
ThreadLocal
将不再是保留请求数据的方便黑客? - 有没有人玩过任何 Servlet 3 实现并尝试使用
ThreadLocal
s 来证明上述内容? - 除了在 HTTP Session 中存储数据之外,您还有其他类似的易于访问的 hack 建议吗?
编辑:不要误会我的意思。我完全理解危险并ThreadLocal
成为黑客。事实上,我总是建议不要在类似的情况下使用它。然而,不管你信不信,线程上下文的使用频率远远超出你的想象。一个很好的例子是 Spring OpenSessionInViewFilter
,根据它的 Javadoc:
此过滤器使 Hibernate Sessions 通过当前线程可用,事务管理器将自动检测到该线程。
这并不严格ThreadLocal
(尚未检查来源),但听起来已经令人震惊。我可以想到更多类似的场景,而丰富的 Web 框架使这更有可能发生。
简而言之,无论有没有意识,许多人都在这个黑客之上建造了他们的沙堡。因此斯蒂芬的回答是可以理解的,但并不完全是我所追求的。我想确认是否有人真正尝试过并且能够重现失败的行为,因此这个问题可以用作其他被同样问题困住的人的参考点。