0

考虑servlet A将用户绑定到这样的会话:

HttpSession session = req.getSession(true);

并且同一用户不久之后对属于同一应用程序的servlet B执行了一个请求。

此时 servlet B 执行时:

HttpSession session = req.getSession(false);

会话为空吗?

4

4 回答 4

4

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

  • 会话超时后发送第二个呼叫
  • 您在两次调用之间重新启动了服务器或重新部署了应用程序
  • 您在两次通话之间重新启动了浏览器
  • 您使用两个不同的浏览器或机器来执行这两个调用
  • 浏览器拒绝 cookie,并且您没有正确编码您的 URL 以使 url 重写会话跟踪工作
  • 两个呼叫之间的另一个呼叫使会话无效
  • 两个 servlet 实际上不在同一个 webapp 中
于 2012-10-13T17:21:00.303 回答
1

HttpServletRequest#getSession

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

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

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

于 2012-10-13T17:16:46.913 回答
0

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

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

一般来说,如果您想避免自动创建会话 - 您必须确保使用会话的代码永远不会在创建会话的代码之前执行。

所以好的做法是如果会话为空,则将用户从 servlet B 重定向到 servlet A。

于 2012-10-13T17:18:52.807 回答
0

正如你所提到的,servletA被称为 first 和servletBnext 。

如果除了您提到的那样没有发生任何事情,您将收到相同的会话(不是 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 前提是在两次调用之间没有发生任何事情来清除您的会话,例如会话过期。

于 2012-10-14T18:33:01.133 回答