考虑 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
收到不空会话,前提是在两次调用之间没有任何变化来清除您的会话,例如会话过期。