欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【session】java.lang.IllegalStateException: getAttribute: Session already invalidated

程序员文章站 2024-02-28 19:51:34
...

1、问题定位:

在执行 

/**
     * 设置用户到session
     *
     * @param session
     * @param user
     */
    public static void saveUserToSession(HttpSession session, User user) {
        session.setAttribute(USER, user);
    }

session.setAttribute(USER, user)方法时会报这个异常


2、原因:

从Session中获取属性值的时候,Session已经无效

失效原因:

(1)Session timeout;

(2)程序中调用了session.invalidate()方法(设置session无效)


发现在之前执行了session.invalidate()操作,重新设置session。如果想给session重新赋值,需要将session

失效。


// 设置session无效
            session.invalidate();
            // 获取用户名
            UserEntity userEntity = new UserEntity();
            userEntity.setId(userName);
            UserUtil.saveUserToSession(session, userEntity);


解决办法:

重新获取session,赋值

UserUtil.saveUserToSession(request.getSession(), userEntity);

注意:

getSession()相当于getSession(true);

参数为true时,若存在会话,则返回该会话,否则新建一个会话;

参数为false时,如存在会话,则返回该会话,否则返回NULL;




3、场景

session.invalidate()方法一般用于在用户退出注销的时候,设置缓存失效。

如果同一个用户打开多个浏览器实例,此时处于同一个session会话中。如果其中一个浏览器实例执行了退出注销操作,另外的浏览器实例如果在执行录入的操作,则会异常