当前位置: 代码迷 >> J2EE >> 重新获取了session为什么还有getAttribute: Session already invalidated 这个异常
  详细解决方案

重新获取了session为什么还有getAttribute: Session already invalidated 这个异常

热度:174   发布时间:2016-04-17 23:49:25.0
重新获取了session为什么还有getAttribute: Session already invalidated 这个错误
重新获取了session为什么还有getAttribute: Session already invalidated 这个错误
我写了一个LoginAction,登录的时候执行login方法,
问题是,第一次登录可以正常登录,但是将原来的页面关了,浏览器不关,再登录的时候就报错说getAttribute: Session already invalidated 
我里面用了session.invalidate();注销了session,但是接着我也重新获取了session啊,而且在后台显示可以一直执行到最下面,求各位大神帮忙啊,都纠结了几天了,百度也搜了不少,他们说的情况和我的有点不一样
谢谢各位了
代码如下

public String login() {
String userid = user.getUserid();
String mima = user.getPassword();
UserDTO user = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
session=request.getSession();
System.out.println(session.getId());
user = (UserDTO) session.getAttribute("USER_INFO");
if (user != null) {
session.invalidate();
session = request.getSession(true);
}
try {
user = userService.getUserByUserid(userid);
} catch (Exception e) {
request.setAttribute("login_error", "无此用户");

e.printStackTrace();
return "login_error";

}
if (user == null) {
request.setAttribute("login_error", "用户不存在或密码错误!");
return "login_error";
}
if (user.getPassword().equals(mima)) {
user.setOnlineflag("1");
userService.updateUser(user);

session.setAttribute("USER_INFO", user);


long endTime = System.currentTimeMillis();
//logger.info("init耗时()" + (endTime - startTime) + "毫秒");
System.out.println("++++++++++执行到这里");
return "login_ok";
} // 用户名和密码核对正确
else {
request.setAttribute("login_error", "用户不存在或密码错误");
return "login_error";
}
}

/**
 *@功能描述:
 *@param request
 *
 */
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request=request;
this.session=request.getSession();

}
public UserDTO getUser() {
return user;
}
public void setUser(UserDTO user) {
this.user = user;
}

}
------解决方案--------------------
session = request.getSession(true);
-->
session = request.getSession(false);

------解决方案--------------------
检查一下在哪行报的异常,在那里个位置前面输出一下sessionID,看与
session.invalidate();
session = request.getSession(true);
这两句前后的sessionID一样不。
------解决方案--------------------
这两句前后的sessionID一样不。
------解决方案--------------------
session = request.getSession(true);
应该和这句有关系。
invalidate();并不是失效。而是使session和现有的对象解绑定。但session还是原来的session.
------解决方案--------------------
应该不要注销那session,
------解决方案--------------------
session.invalidate();不知道你为什么要将整个session都销毁。。。

注销用户,只需要移除你当前用户的不就可以了吗?
session.removeAttribute("USER_INFO");

------解决方案--------------------
其实getAttribute: Session already invalidated 都已经全告诉你了;
你注销了session,当你用注销了的session来获取attribute时(只要是在session有效的范围内),肯定出错了;
要解决这个问题,就是在所有调用了session.getAttribute()前,使用session=request.getSession(true);
------解决方案--------------------
这个说法我同意
引用:
session.invalidate();不知道你为什么要将整个session都销毁。。。

注销用户,只需要移除你当前用户的不就可以了吗?
session.removeAttribute("USER_INFO");

------解决方案--------------------
request对象中有个 requestedSessionId属性,它保存客户端提交的cookie中jsessionid的值,服务器端也是根据request.requestedSessionId的值来创建session的..

虽然你前面session.invalidate()了,但request.requestedSessionId的值没变,所以你后面reqquest.getSession(true)获得的session是 之前的session,它现在处于invalidate状态,所以你调用的时候报异常...


我觉得在登录的时候没必要session.invalidate()这么做吧..
  相关解决方案