如何在标准Java类中访问会话状态?

时间:2010-10-01 08:03:03

标签: java session servlets

我需要一种机制来从Java类读取会话状态,而不必将任何参数(包括HttpRequest)传递给类。原因是该类是远离servlet的1-3个调用,并且我不想为每个调用使用额外的arg污染方法参数列表。 我基本上和这些人有相同的概率: http://forums.sun.com/thread.jspa?threadID=5124189

显然Java目前没有解决方案..

干杯

4 个答案:

答案 0 :(得分:4)

诱人机制是使用ThreadLocal存储,但在某些App Server中这是危险的 - App Server可能使用线程池,并且单个请求可能由不同点的不同线程处理。

某些应用服务器(我知道WebSphere确实如此)为此提供了一个特定的API。在WAS中,它是UserWorkArea。请参阅here以获取参考信息,在文章中稍微介绍一下。

我不知道这个问题的便携式解决方案。

答案 1 :(得分:2)

不要将HttpSession传递给“标准”Java类。为了更好的解决方案,请检查依赖注入容器(如Spring或Guice)并阅读有关会话范围的信息。

这通常通过线程本地模式和servlet过滤器的组合来解决,但是通常有“标准”Java类来直接访问会话,请求等等。

答案 2 :(得分:1)

一种解决方案可能是使用ThreadLocal。在请求结束时要小心清理它。

答案 3 :(得分:0)

你想要的实际上是一个全局变量,并且“污染”其他类中的参数列表要清晰得多。它更容易阅读和测试。

如果你想根据servlet.jar避免你的代码,请使用适配器模式:创建所需操作的接口,让你的方法接受该接口的参数,并创建一个简单的包装器实现代表参加HttpSession。