【发布时间】:2010-10-01 08:03:03
【问题描述】:
我需要一种机制来从 Java 类中读取会话状态,而无需将任何参数(包括 HttpRequest)传递给该类。原因是该类距离 servlet 有 1-3 次调用,我不想在每次调用时使用额外的 arg 来污染方法参数列表。 我基本上对这些人有同样的可能性: http://forums.sun.com/thread.jspa?threadID=5124189
显然Java目前没有解决方案..
干杯
【问题讨论】:
我需要一种机制来从 Java 类中读取会话状态,而无需将任何参数(包括 HttpRequest)传递给该类。原因是该类距离 servlet 有 1-3 次调用,我不想在每次调用时使用额外的 arg 来污染方法参数列表。 我基本上对这些人有同样的可能性: http://forums.sun.com/thread.jspa?threadID=5124189
显然Java目前没有解决方案..
干杯
【问题讨论】:
诱人的机制是使用 ThreadLocal 存储,但在某些 App Server 中这是危险的 - App Server 可能使用线程池,并且单个请求可能在不同点由不同线程处理。
一些应用服务器(我知道 WebSphere 有)为此提供了特定的 API。在 WAS 中,它是一个 UserWorkArea。请参阅here 获取参考,在文章下方。
我不知道这个问题的便携式解决方案。
【讨论】:
不要将 HttpSession 传递给“标准”Java 类。要获得更好的解决方案,请检查 Spring 或 Guice 等依赖注入容器并阅读会话范围。
这通常通过线程本地模式和 servlet 过滤器的组合来解决,但是让“标准”Java 类直接访问会话、请求等通常是不好的。
【讨论】:
一种解决方案是使用ThreadLocal。请在请求结束时小心清洁它。
【讨论】:
您想要的实际上是一个全局变量,并且“污染”其他类中的参数列表要干净得多。它变得更容易阅读和测试。
如果您想避免您的代码依赖于 servlet.jar,请使用适配器模式:为您需要的操作创建一个接口,让您的方法接受该接口的参数,并对其进行简单的包装器实现委托给 HttpSession。
【讨论】: