考虑servlet A将用户绑定到这样的会话:
HttpSession session = req.getSession(true);
并且同一用户不久之后对属于同一应用程序的servlet B执行了一个请求。
此时 servlet B 执行时:
HttpSession session = req.getSession(false);
会话为空吗?
以下是此代码返回 null 的可能原因:
true
如有必要,为此请求创建一个新会话;如果没有当前会话false
,则返回 null
您需要检查您在第二个 servlet 的请求中收到的会话 ID。您可以使用getRequestedSessionId
仅当您的会话在两次调用之间或在浏览器获取session id
您调用之前无效时,才会发生这种情况SeveletB
它实际上取决于 servlet 的顺序:
一般来说,如果您想避免自动创建会话 - 您必须确保使用会话的代码永远不会在创建会话的代码之前执行。
所以好的做法是如果会话为空,则将用户从 servlet B 重定向到 servlet A。
正如你所提到的,servletA
被称为 first 和servletB
next 。
如果除了您提到的那样没有发生任何事情,您将收到相同的会话(不是 null),servletB
其中 used/created in 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
前提是在两次调用之间没有发生任何事情来清除您的会话,例如会话过期。