【问题标题】:request.isRequestedSessionIdValid() returns true after invalidating the sessionrequest.isRequestedSessionIdValid() 在会话无效后返回 true
【发布时间】:2016-07-12 18:44:41
【问题描述】:

当我注销用户时,我通过调用 session.invalidate() 来使他的会话无效并将自己重定向回登录页面。

我的应用程序中除了登录页面之外的每个页面都是一个 JSP 页面。我在每个 JSP 页面中检查的是请求的会话是否存在以及请求的会话 ID 是否有效。

注销用户并调用 session.invalidate() 后,如果我尝试直接打开我的主页的 url,它仍然返回 request.isRequestedSessionIdValid() 为 true。此外,调用 session.invalidate() 不会使会话为空。

以下是我的代码:

注销.java

       session.inValidate();

在我的 home.jsp 中。我正在明确检查请求的会话是否有效。 以下是代码:

         HttpSession session=request.getSession();
         boolean a=request.isRequestedSessionValid()
         if(session==null || a==false){
         ...
         ...
         }

问题是 session 不返回 null 并且 a 仍然是 true,即使在注销用户之后(使 session 无效)。

感谢任何帮助!

【问题讨论】:

标签: session servlets invalidation


【解决方案1】:

我通过调用 session.invalidate() 使他的会话无效并将自己重定向回登录页面。

如果客户端在其会话无效后发出新请求,则 web 应用程序将在新的初始有效会话的上下文中处理该请求。如果 webapp 在会话失效和新请求之间向客户端发送响应,包括但不限于重定向响应,则该新请求不太可能请求失效会话的 ID。这是因为无论通过何种方式维护会话关联,响应都会让 webapp 有机会将前一个会话的结束信息传达给客户端,如果它甚至需要这样做的话。

在这种情况下,客户端可能会也可能不会请求任何会话 ID。如果没有,那么您将看到request.isRequestedSessionIdValid() 返回false;否则,您将看到request.isRequestedSessionIdValid() 返回false 的主要情况是会话自最近一次响应后超时。您不能依靠它来确定用户是否已通过身份验证。

注销用户并调用session.invalidate()后,如果我尝试直接打开我主页的url,它仍然返回request.isRequestedSessionIdValid()为true。

为什么不应该呢?

另外,调用 session.invalidate() 不会使会话为空。

不,它没有,也不应该。如果你想能够检测会话是否已经失效,那么你可以利用它失效后,它的大部分方法都会抛出IllegalStateException这一事实。但是,如果您发现自己需要知道这一点——除了在适当的上下文中捕获和处理 IllegalStateException 之外——那么你可能做错了什么。

【讨论】:

  • 感谢您的回复,约翰。所以基本上我想做的是注销用户。因此,为此,我使会话无效。他们有比这更好的方法吗?也因为我的每个页面都是 JSP。因此,在每个页面中,我正在检查与请求关联的会话是否有效,如果不是,我将显示登录页面。所以,这适用于类似的东西。假设您注销 facebook.com,然后键入 facebook.com/home(只是一个示例)它将向您显示登录页面。我的方法不好吗?
  • 当您注销用户时使会话无效是绝对标准的。如果您希望能够确定用户是否已登录,那么成功登录应该以这样指示的方式修改会话。一种典型的机制是将属性附加到会话——通常是描述登录用户的对象。如果您使用 JAAS 来确保安全性,那么您甚至可能不需要这样做:HttpServletRequest.isUserInRole() 可能就足够了。
  • 我没有使用 JAAS,将看看那个。谢谢。所以,它必须是某种黑客?你的意思是在会话中附加一些东西。
  • @IndraneelBende,将属性附加到会话不是 hack;这实际上就是会议的目的。除其他外,它是您的 JSP 跟踪会话范围变量的方式。假设您希望会话携带有关登录用户的信息以供您的 JSP 和 servlet 使用,让登录过程附加该信息是很自然的,因此,如果其他页面重定向用户登录没有附加信息。
  • 欣赏你们的cmets!谢谢!
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2016-06-01
相关资源
最近更新 更多