【问题标题】:Accessing HttpContext, HttpServletRequest and HttpServletResponse from any place in the code从代码中的任何位置访问 HttpContext、HttpServletRequest 和 HttpServletResponse
【发布时间】:2011-05-17 06:25:33
【问题描述】:

我想要的是从我的应用程序中的任何位置访问当前的 HttpServlerRequest + HttpServletResponse + HttpSession + 一些其他重要信息,如用户数据和用户偏好。目前,我正在创建一个特殊对象 MyServletContext,然后将其作为第一个参数传递给我所有对象的所有方法。我想摆脱这个参数,但我不确定最好的方法是什么。

我的一个想法是创建一个全局缓存,在其中存储由当前线程散列的 MyServletContext。每当我需要存储在 MyServletContext 中的任何信息时,我都会调用此缓存,它会为我找到正确的对象。我知道我需要使这个缓存线程安全并且我知道该怎么做。 问题是:有没有更好的方法呢?

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    我曾经为此使用 ThreadLocal。创建 HttpFilter 将 HttpRequest 放入 ThreadLocal 并在代码中的任何地方使用它。

    【讨论】:

      【解决方案2】:

      使用ThreadLocal 是实现此目的的典型方式,但确实不是一个好的选择。

      到处传递整个上下文也不可取。

      最好的做法是仅将所需的数据作为参数传递。因此,您不会使您的服务层依赖于 Web 层。而且它的可测试性更强。

      【讨论】:

      • 确实,只是需要的。这减少了耦合并增加了可重用性(如果您不关心这一点,则可调试性)
      • 我明白了。我可以轻松地停止传递 HttpXXX 变量,因为它们仅在请求处理的顶层需要。然而,在很多地方都需要我的用户数据和用户偏好。此外,即使我想在不同的环境中使用我的核心对象(例如控制台应用程序),我仍然需要这些信息。所以它似乎不会以任何方式影响可重用性。是否有充分的理由不为此目的使用 ThreadLocal?
      • > 使用 ThreadLocal 是一种典型的实现方式,但它确实不是一个好的选择。为什么这么说?
      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多