繁体   English   中英

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

[英]Why session is not null after session.invalidate() in JAVA?

我在开发 JavaEE WEB 应用程序时面临着非常奇怪的问题。

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

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

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

调用session.invalidate()从注册表中删除会话。 之后调用getSession(false)将返回 null(请注意,在这种情况下getSession()getSession(true)将创建一个新会话,请参阅HttpServletRequest API )。 调用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
}

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

Invalidates this session then unbinds any objects bound to it.

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

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

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM