Servlets和会话

时间:2012-10-13 17:13:09

标签: java servlets

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

HttpSession session = req.getSession(true);

和同一个用户执行后不久 对 servlet B 的请求属于同一个应用程序 servelt A

此时当servlet B执行时:

HttpSession session = req.getSession(false);

是会话空吗?

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

HttpServletRequest#getSession

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

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

执行此操作

只有当您的会话在两次通话之间或浏览器获得session id之前已经无效时才会发生这种情况SeveletB

答案 2 :(得分:0)

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

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

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

如果会话为空,那么很好的做法是将用户从servlet B重定向到servlet A.

答案 3 :(得分:0)

如您所述,首先调用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 中收到 not null 会话,前提是两次调用之间没有任何反应消灭你的会话,例如会话到期。