【问题标题】:Getting current session object in Java在 Java 中获取当前会话对象
【发布时间】:2011-03-23 02:22:36
【问题描述】:

我可以从不存在请求对象的函数中访问会话对象吗?

我知道在 Java 中我们访问会话是这样的:

HttpSession session = request.getSession(true);

但是如果我们想在请求对象不存在时访问会话呢?

有可能吗?是否有另一种获取会话对象的方法?

编辑

我有一个 servlet

public class ABC extends HttpServlet
{
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
    {
             ..........
             ...........
        myFun1(x,y,z);  
    }

      private void myFun1(int x, int y,long z)
      {
            .........
            myFun2(a,b);    
       }

      private void myFun2(int a,String b)
      {
            .........

            //      Need Session here
       }

}

【问题讨论】:

  • 如果您没有特定请求,您如何知道要获得哪个会话?在此过程中可能有多个实时会话。
  • 谢谢,我会将请求对象作为额外参数传递给函数。

标签: java session servlets


【解决方案1】:

这取决于“当请求对象不存在时”的含义。您可以有一个线程局部变量,它在 servlet 或您正在运行的任何东西的早期设置“该线程的当前请求”(您还没有说清楚)。然后,您可以从任何地方获取“此线程中的当前请求”,并以这种方式获取会话。 (或者按照同样的思路,您可以在线程局部变量中设置当前的 session 而不是当前的 request。)

虽然它不是非常漂亮,如果你想在不同的线程上做一些事情,你会遇到问题。将请求或会话作为依赖项向下传递通常更简洁。

【讨论】:

    【解决方案2】:

    不过,一般来说,如果您想从请求对象不可用的地方访问 http 会话,那么您的应用程序中可能存在设计问题,您需要重新考虑关注点、分层等。

    【讨论】:

      【解决方案3】:

      如果您在应用程序中实现JSF 技术,您可以通过调用访问所有内容;

      FacesContext.getCurrentInstance();
      

      因为这是一个检索到的单例实例,所以您可以在表示层的任何位置访问它。

      然而,仅仅为了这个目的,实现 JSF 可能有点矫枉过正,因为您可能必须对配置和表示层进行大量更改以适应它。

      也就是说,如果您决定走这条路,您还可以考虑使用MyFaces,对于那些在应用程序中使用 JSF 的人来说,这是一个很棒的 AP​​I。

      【讨论】:

      • 它不返回单例。它返回一个线程本地引用。
      • 谢谢巴鲁斯,我试图保持简单,但你完全正确。
      【解决方案4】:

      传递请求对象是解决方案,

      public class ABC extends HttpServlet
      {
          public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
          {
                   ..........
                   ...........
              myFun1(x,y,z,req);  
          }
      
            private void myFun1(int x, int y,long z,HttpServletRequest req)
            {
                  .........
                  myFun2(a,b,req);    
             }
      
            private void myFun2(int a,String b,HttpServletRequest req)
            {
                  .........
      
                  //      Need Session here
             }
      
      }
      

      【讨论】:

        【解决方案5】:

        我们必须配置一个HttpSessionListener 类型的监听器,它的方法将在会话创建时和分心时被调用。如果你通过准备这个类的对象来使用它,你可以简单地得到 Session 对象......

        【讨论】:

        • 我被“分心时间”逗笑了。
        猜你喜欢
        • 2013-07-16
        • 2014-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-20
        • 1970-01-01
        相关资源
        最近更新 更多