当我注销用户时,我通过调用session.invalidate()并将自己重定向回登录页面来使其会话无效。
我的应用程序中除登录页面之外的每个页面都是JSP页面。我在每个JSP页面中检查的是所请求的会话是否存在以及所请求的会话ID是否有效。
在注销用户并调用session.invalidate()之后,如果我尝试直接打开我的主页的url,它仍然会将request.isRequestedSessionIdValid()返回为true。此外,调用session.invalidate()不会使会话为空。
以下是我的代码:
Logout.java
session.inValidate();
在我的home.jsp。我明确检查请求的会话是否有效。 以下是代码:
HttpSession session=request.getSession();
boolean a=request.isRequestedSessionValid()
if(session==null || a==false){
...
...
}
麻烦是会话不返回null,即使在注销用户(使会话无效)之后,a仍然为真。
感谢任何帮助!
答案 0 :(得分:1)
我通过调用session.invalidate() 并将自己重定向回登录页面来使其会话无效。
如果客户端在其会话失效后发出新请求,则webapp将在新的,最初有效的会话的上下文中处理该请求。如果webapp在会话失效和新请求之间向客户端发送响应,包括但不限于重定向响应,则该新请求不太可能请求无效会话的ID。这是因为无论以何种方式维护会话关联,响应都会让webapp有机会将上一个会话的结束传达给客户端,如果它甚至需要这样做的话。
在这种情况下,客户端可能会或可能不会请求任何会话ID。如果没有,那么您会看到request.isRequestedSessionIdValid()
返回false
;否则,您将看到request.isRequestedSessionIdValid()
返回false
的主要方案是自最近一次响应以来会话超时的情况。您不能依赖于此来确定用户是否已通过身份验证。
在注销用户并调用session.invalidate()之后,如果我尝试直接打开我的主页的url,它仍然会将request.isRequestedSessionIdValid()返回为true。
为什么不呢?
此外,调用session.invalidate()不会使会话为空。
不,它不是,也不应该。如果您希望能够检测会话是否已失效,那么您可以利用这样一个事实:在它失效后,它的大多数方法将抛出IllegalStateException
。但是如果你发现自己需要知道这一点 - 除了在适当的上下文中捕获和处理IllegalStateException
- 那么你可能做错了。