【问题标题】:How to access Session state in standard Java class?如何访问标准 Java 类中的会话状态?
【发布时间】:2010-10-01 08:03:03
【问题描述】:

我需要一种机制来从 Java 类中读取会话状态,而无需将任何参数(包括 HttpRequest)传递给该类。原因是该类距离 servlet 有 1-3 次调用,我不想在每次调用时使用额外的 arg 来污染方法参数列表。 我基本上对这些人有同样的可能性: http://forums.sun.com/thread.jspa?threadID=5124189

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

干杯

【问题讨论】:

    标签: java session servlets


    【解决方案1】:

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

    一些应用服务器(我知道 WebSphere 有)为此提供了特定的 API。在 WAS 中,它是一个 UserWorkArea。请参阅here 获取参考,在文章下方。

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

    【讨论】:

    • 是的,我们正在 WAS 中执行此操作。出于同样的原因,我没有提出这个建议。所以,我会说 +1。
    • 找到了这个,devwebsphere.com/devwebsphere/2005/06/dont_use_thread.html。虽然很老,但我认为值得一读。
    • 谢谢,我正在使用 Tomcat6,但不确定它是否是 1 个线程/请求...将查看本地线程 - 谢谢!
    【解决方案2】:

    不要将 HttpSession 传递给“标准”Java 类。要获得更好的解决方案,请检查 Spring 或 Guice 等依赖注入容器并阅读会话范围。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我如何知道请求何时结束?你知道我是否可以在 struts 拦截器中安全地使用 threadlocal 吗?
      【解决方案4】:

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

      如果您想避免您的代码依赖于 servlet.jar,请使用适配器模式:为您需要的操作创建一个接口,让您的方法接受该接口的参数,并对其进行简单的包装器实现委托给 HttpSession。

      【讨论】:

        猜你喜欢
        • 2011-04-14
        • 2012-06-23
        • 2012-08-26
        • 1970-01-01
        • 2013-10-08
        • 2013-07-03
        • 1970-01-01
        • 2012-04-04
        • 2011-03-15
        相关资源
        最近更新 更多