代码之家  ›  专栏  ›  技术社区  ›  Manjoor

在Java中获取当前会话对象

  •  10
  • Manjoor  · 技术社区  · 14 年前

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

    我知道在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
           }
    
    }
    
    5 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    14 年前

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

    不过,它并不十分漂亮,如果你想在另一个线程上做一些事情,你就会遇到问题。将请求或会话作为依赖项向下传递通常比较干净。

        2
  •  6
  •   cherouvim    14 年前

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

        3
  •  1
  •   Alasdair    14 年前

    如果你实施 JSF 在你的应用程序技术,你可以访问一切通过调用;

    FacesContext.getCurrentInstance();
    

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

    然而,仅仅为了这个目的,实现JSF可能有点过头了,因为您可能需要在配置和表示层中做很多更改来适应它。

    也就是说,如果你决定走这条路,你也可以考虑使用 MyFaces

        4
  •  1
  •   sohilv    14 年前

    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
  •  0
  •   Spontifixus    12 年前

    我们必须配置一个类型为 HttpSessionListener 它的方法将在会话创建时和分心时调用。如果您通过准备这个类的对象来实现这一点,那么您可以简单地获得Session对象。。。