Java servlet和会话

Java servlet和会话,java,servlets,Java,Servlets,考虑servlet A将用户绑定到如下会话: HttpSession session = req.getSession(true); 而这个用户很快就会执行 对属于同一应用程序的servlet B的请求 of服务于A 此时,当servlet B执行时: HttpSession session = req.getSession(false); 会话是否为空? true必要时为此请求创建新会话false如果没有当前会话,则返回null 您需要在第二个servlet的请求中检查您收到的会话id。您

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

HttpSession session = req.getSession(true);
而这个用户很快就会执行 对属于同一应用程序的servlet B的请求 of服务于A

此时,当servlet B执行时:

HttpSession session = req.getSession(false);
会话是否为空?

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

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

只有在您的会话在两次调用之间或在浏览器获取
会话id
之前失效,并且您已经调用了
SeveletB

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

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


只有当您的会话在两次调用之间或在浏览器获取会话id之前失效时,才会发生这种情况。您已经调用了
SeveletB

,这实际上取决于servlet的顺序:

  • 如果servlet B将在A之前调用,则不会创建会话
  • 如果servlet A将在B之前被调用,则将创建会话,servlet B将有权访问会话
通常,如果要避免自动创建会话,必须确保使用会话的代码永远不会在创建会话的代码之前执行


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

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

  • 如果servlet B将在A之前调用,则不会创建会话
  • 如果servlet A将在B之前被调用,则将创建会话,servlet B将有权访问会话
通常,如果要避免自动创建会话,必须确保使用会话的代码永远不会在创建会话的代码之前执行


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

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

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

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

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

      正如您所提到的,
      servletA
      首先被调用,
      servletB
      接着被调用

      如果如您所述,除此之外没有发生任何事情,您将在
      servletB
      中收到在
      servletA
      中使用/创建的相同会话(notnull

      在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会话,前提是在两次调用之间不会发生任何事情来清除会话,例如会话过期。

      如您所述,首先调用
      servletA
      ,然后调用
      servletB

      如果如您所述,除此之外没有发生任何事情,您将在
      servletB
      中收到在
      servletA
      中使用/创建的相同会话(notnull

      在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会话,前提是在两次调用之间不会发生任何事情来清除会话,例如会话过期。

      您测试过吗?你得到了什么?在那次声明之后,
      sysout(session)
      。我得到空值…但我没想到如果真的发生了这种情况,那么在这两次调用之间一定有什么东西破坏了会话。什么是会话过期设置?您测试了吗?你得到了什么?在那次声明之后,
      sysout(session)
      。我得到空值…但我没想到如果真的发生了这种情况,那么在这两次调用之间一定有什么东西破坏了会话。什么是会话过期设置?但是OP首先使用
      true
      创建新会话,然后使用
      false
      。这样他就可以参加现有的会议了。。但事实并非如此。它返回
      null
      。是。只有在发出第二次请求时,
      会话id
      不在浏览器中时,这才可能。但是OP首先使用
      true
      创建新会话,然后使用
      false
      。这样他就可以参加现有的会议了。。但事实并非如此。它返回
      null
      。是。这只有在发出第二个请求时,浏览器没有使用会话id时才可能。在我的示例中,servlet a首先被调用,但不cre