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

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会话中。如果其中一个浏览器实例执行了退出注销操作,另外的浏览器实例如果在执行录入的操作,则会异常



你可能感兴趣的:(Spring)