2013-01-21 43 views
11

我在servlet的会议开幕,当用户进行登录成功:如果一个会话如何验证/无效会话jsp/servlets?

<%session.invalidate();%> 

检查:

HttpSession session = request.getSession(true); 
session.setAttribute("name", name); 

然后我在logout.jsp写信给终止会话有效我这样做:

HttpSession session = request.getSession(); 
String name = (String) session.getAttribute("name"); 

但它不工作,即使在session.invalidate后,我得到的会话有效。 有没有人知道我在哪里做错了?

+0

看起来已经回答了: http://stackoverflow.com/questions/4899500/jsf-logout-using-session-invalidate-does-not-clear-the-current-username –

+0

没有它不回答我的问题,我说的是jsp/servlets而不是jsf标签。另一方面,我想知道我的代码中存在什么问题 –

+0

这个想法是一样的,您应该将请求重定向到一个新页面,而容器最终会使您的旧会话无效。 –

回答

22

您应该调用session.getSession(false) - 如果没有当前会话,则返回null。根据docs

HttpSession#getSession(boolean create)

- 创造 - 真正创造必要时申请一个新的会话;如果没有当前会话,则返回null。

所以会话值检验的正确的方法是 -

HttpSession session = request.getSession(false); 
if(session!=null) 
    session.setAttribute("name", name); 

,一旦你无效会话 -

HttpSession session = request.getSession(false); 
if(session!=null) 
session.invalidate(); 
+2

谢谢,so request.getSession(false)如果session是活动的,会返回什么?对不起,但我想真正理解这一点。 –

+0

它将返回您当前的会话。 –

+2

这是正确的答案。只需添加@AlbanoVito,您可能会对[清除浏览器缓存](http://stackoverflow.com/a/3902700/1317692)感兴趣。 – Fallup

-1

来验证会话

HttpSession session = request.getSession(true); 
session.setAttribute("name", name); 

为无效它你需要做

session.removeAttribute("name"); 
session.invalidate(); 

但是你需要保持一件事记住,对象可能变为无效,但这个亘古不意味着它会立即清除,即使是无效之后后,其所有属性消失有可能是sesssion对象将得到重用,我得到了相同的用户ID和创建时间。