为什么在JAVA中session.invalidate()之后会话不为空?

时间:2014-07-10 13:33:58

标签: java session invalidation

在开发JavaEE WEB应用程序时,我遇到了一个非常奇怪的问题。

即使使用HttpSession使session.invalidate();无效,我也无法获得会话null。有一种情况,我在执行会话后会有一个如下所示的语句。

if (null != session && null != session.getAttribute("loginToken")){
   //do something
}

我在这里没有获得会话null,所以第二个条件将尝试执行。因此会话不为空,所以我得到IllegalStateException - session is already invalidated。但是为什么会话在使它失效后不为空? :(

3 个答案:

答案 0 :(得分:12)

调用session.invalidate()会从注册表中删除会话。之后调用getSession(false)将返回null(请注意getSession()getSession(true)将在此情况下创建新会话)。调用invalidate()也将删除绑定到会话的所有会话属性。但是,如果您的代码仍然具有对会话或其任何属性的引用,那么这些仍然可以访问:

    // create session if none exists (default) and obtain reference
    HttpSession session = request.getSession();

    // add a session attribute
    session.setAttribute("lollypop", "it's my party");

    // obtain reference to session attribute 
    Object lollypop = session.getAttribute("lollypop");

    // print session ID and attribute
    System.out.println(session.getId());
    System.out.println(lollypop);

    session.invalidate();

    // session invalidated but reference to it still exists
    if (session == null) {            
        System.out.println("This will never happen!");
    }

    // print ID from invalidated session and previously obtained attribute (will be same as before)
    System.out.println(session.getId());
    System.out.println(lollypop);

    // print 'null' (create=false makes sure no new session is created)
    System.out.println(request.getSession(false));

示例输出:

1k47acjdelzeinpcbtczf2o9t
it's my party
1k47acjdelzeinpcbtczf2o9t
it's my party
null

到目前为止的解释。要解决您的问题,您应该这样做:

HttpSession existingSession = request.getSession(false);
if (existingSession != null && existingSession.getAttribute("loginToken") != null){
   //do something
}

答案 1 :(得分:4)

invalidate方法执行以下操作(来自API):

Invalidates this session then unbinds any objects bound to it.

它没有说明HttpSession - 对象本身,但使会话的变量无效。如果调用类的方法,则在该方法调用之后对象不可能是null。如果您的会话之后应该为null,则该方法必须包含类似于this = null;的行,这是不可能的。为无效会话抛出异常是首选方法。

答案 2 :(得分:1)

尝试将false作为参数传递给getSession(boolean)。如果会话存在,这将返回一个会话,否则它将返回null。

HttpSession session = request.getSession(false);
if(session==null || !request.isRequestedSessionIdValid() )
{
    //comes here when session is invalid.

}