在Java中获取当前会话对象

在Java中获取当前会话对象,java,session,servlets,Java,Session,Servlets,我可以从不存在请求对象的函数中访问会话对象吗 我知道在Java中,我们访问会话的方式如下: HttpSession session = request.getSession(true); 但如果我们想在请求对象不存在时访问会话,该怎么办 可能吗?是否有其他方法获取会话对象? 编辑 我有一个servlet public class ABC extends HttpServlet { public void doPost(HttpServletRequest req, HttpServle

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

我知道在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
       }

}

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


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

传递请求对象是解决方案

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
       }

}

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

如果您在应用程序中实现了技术,您可以通过调用

FacesContext.getCurrentInstance();
因为这是检索到的单例实例,所以您可以在表示层中的任何位置访问它

然而,仅仅出于这个目的,实现JSF可能有点过火,因为您可能需要在配置和表示层中进行大量更改以适应它


这就是说,如果你决定走这条路,你也可以考虑使用,这对于那些在应用程序中使用JSF的人来说是一个非常棒的API。

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

如果您没有特定的请求,您如何知道要获得什么会话?进程中可能有多个实时会话。Thnaks,我将把请求对象作为一个额外参数传递给函数。它不会返回单例。它返回一个线程本地引用。谢谢你,巴卢斯,我试图保持它的简单,但你完全正确。我从“分心时间”中得到了一个咯咯的笑声。