为什么会话在会话后不为空。在 JAVA 中无效()?

2022-09-04 08:16:51

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

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

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

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


答案 1

调用将从注册表中删除会话。之后的调用将返回 null(请注意,或者在这种情况下将创建一个新会话,请参阅 HttpServletRequest API)。调用还将删除绑定到会话的所有会话属性。但是,如果您的代码仍然具有对会话或其任何属性的引用,则仍然可以访问这些属性:session.invalidate()getSession(false)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
}

答案 2

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

Invalidates this session then unbinds any objects bound to it.

它对 -object 本身没有任何说明,但会使会话的变量无效。如果调用类的方法,则对象不可能位于该方法调用之后。如果会话之后应为 null,则该方法必须包含一行,如下所示:这是不可能的。为无效会话引发异常是执行此操作的首选方法。HttpSessionnullthis = null;


推荐