Servlets and session



考虑 servlet A 将用户绑定到如下所示的会话:

HttpSession session = req.getSession(true);

并且同一用户在执行后不久执行对属于同一应用程序的 servlet B 的请求的塞尔特·

此时,当 Servlet B 执行时:

HttpSession session = req.getSession(false);

会话是否为空?

以下是此代码返回 null 的可能原因:

  • 第二个调用在会话超时后发送
  • 在两次调用之间重新启动服务器或重新部署应用
  • 您在两次调用之间重新启动了浏览器
  • 您使用了两个不同的浏览器或计算机来执行这两个调用
  • 浏览器拒绝 Cookie,并且您没有正确编码您的 URL 以使 URL 重写会话跟踪正常工作
  • 两个调用之间的另一个调用使会话无效
  • 事实上,两个 servlet 并不在同一个 Web 应用程序中

HttpServletRequest#getSession

如有必要,true为此请求创建新会话; false如果没有当前会话则返回 null

您需要检查在第二个 servlet 的请求中收到的会话 ID。您可以使用getRequestedSessionId

仅当您的会话在两次调用之间或在浏览器session id您调用SeveletB之前失效时,才会发生这种情况

它实际上取决于 servlet 的顺序:

  • 如果在 A 之前调用 servlet B,则不会创建会话
  • 如果在 B 之前调用 servlet A,则将创建会话,并且 Servlet B 将可以访问它。

通常,如果要避免自动创建会话 - 必须确保使用会话的代码永远不会在创建会话的代码之前执行。

因此,如果会话为空,则最好将用户从 servlet B 重定向到 servlet A。

正如你提到的,servletA被称为第一,servletB下一个。

如果如您所提到的其他任何事情都没有发生,您将收到在servletB servletA中使用/创建的相同会话(不为空)。

在servletA中,

      getSession(true) in servletA means create and return the session if not 
      present otherwise return the existing session

在 servletB 中,

      getSession(false) in servletB means return the existing session if present 
      otherwise return null.

由于您肯定已经在servletA中创建了一个会话,因此您将在servletB收到不空会话,前提是在两次调用之间没有任何变化来清除您的会话,例如会话过期。

最新更新