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