在Java中获取当前会话对象

时间:2010-07-30 06:28:34

标签: java session servlets

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

我知道在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 个答案:

答案 0 :(得分:6)

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

虽然它并不是非常漂亮,如果你想在不同的线程上做某事,你就会遇到问题。将请求或会话作为依赖关系传递通常更清晰。

答案 1 :(得分:6)

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

答案 2 :(得分:1)

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

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
       }

}

答案 3 :(得分:1)

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

FacesContext.getCurrentInstance();

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

然而,实现JSF可能只是为了这个目的而略显过度,因为您可能需要在配置和表示层中进行大量更改以适应它。

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

答案 4 :(得分:0)

我们必须配置一个HttpSessionListener类型的侦听器,它的方法将在会话创建时和分心时调用。如果您通过准备此类的对象来完成此操作,则可以简单地获取Session对象...