request.isRequestedSessionIdValid()在使会话无效后返回true

时间:2016-07-12 18:44:41

标签: session servlets invalidation

当我注销用户时,我通过调用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仍然为真。

感谢任何帮助!

1 个答案:

答案 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 - 那么你可能做错了。