Java 当请求来自web服务器而不是web浏览器时,HTTPSession的创建是如何工作的?

Java 当请求来自web服务器而不是web浏览器时,HTTPSession的创建是如何工作的?,java,session,web-applications,tomcat,servlets,Java,Session,Web Applications,Tomcat,Servlets,我有一个非常基本的问题,HTTPSession的创建是如何工作的。我知道你们会把我当作类似的问题来看待的 问题是存在的,但我提出这个问题的原因是:- 我知道httpsession是web浏览器独有的,服务器在我们第一次执行HttpServletRequest.getSession时创建了它。它将保持相同的会话,直到我们 关闭浏览器。但我有一个稍微不同的场景。我在一个tomcat实例上有一个web应用程序,比如T1。在这个web应用程序的欢迎页面上 我在点击时提供了两个链接,这两个链接将我带到托管

我有一个非常基本的问题,HTTPSession的创建是如何工作的。我知道你们会把我当作类似的问题来看待的 问题是存在的,但我提出这个问题的原因是:-

我知道httpsession是web浏览器独有的,服务器在我们第一次执行HttpServletRequest.getSession时创建了它。它将保持相同的会话,直到我们 关闭浏览器。但我有一个稍微不同的场景。我在一个tomcat实例上有一个web应用程序,比如T1。在这个web应用程序的欢迎页面上 我在点击时提供了两个链接,这两个链接将我带到托管在另一个tomcat实例T2上的不同web应用程序的同一个Javaservlet(S1)(这两个链接 打开两个单独的弹出窗口)。现在我首先单击link1并检查S1中的sessionId,发现它的值为1678。现在,我首先单击链接2和 检查S1中的sessionId并再次找到其值,即1678我这里的问题是,为什么我得到的两个原始请求的会话id相同 来自link1和link2?如何才能为这两个请求获得不同的会话?

我在网上寻找可能的解决方案后尝试了什么:-在Servlet S1中单击link1,复制会话属性,使其无效并创建新的会话属性。 假设新会话id为8765。现在我单击link2,在这个请求中也找到了相同的会话。所以我进一步使它无效,并创建一个新的(比如 新会话id为4897)。理想情况下,它应该使第一个浏览器会话(在单击link1时生成)过期。为了验证它,我在弹出窗口1上单击了它没有得到的任何地方 已过期,但我再次看到最后生成的会话id,即4897。我不明白为什么它会在两个弹出窗口中附加相同的会话id

各位,感谢你们耐心地抽出时间阅读这篇长篇大论?

编辑:-

      Cookie[] cookies = req.getCookies(); 
        if(cookies!=null) 
        for (int i = 0; i < cookies.length; i++) { 
         cookies[i].setMaxAge(0); 
         context.getResponse().getHttpServletResponse().addCookie(cookies[i]);
        } 

    HttpSession myAppSession = req.getSession();//line 1
Cookie[]cookies=req.getCookies();
如果(cookies!=null)
对于(int i=0;i
假设在点击链接1时,我得到的会话id为1234,然后在点击链接2后,我也得到了相同的会话id。根据我的理解,在执行第1行以上的代码后,我应该得到不同的会话id,因为在获得会话之前,我将MaxAge设置为0。但是它没有发生吗?

我想这就是你想要的:

默认情况下,会话跟踪是通过cookies进行的WebServer以cookie的形式将会话id发送到浏览器。并且,浏览器为后续请求发送具有会话id的cookie

浏览器如何识别为链接/请求发送哪些cookie? 它是基于这些参数。如果请求与这些参数匹配,浏览器将发送特定的cookie

  • 域:向其发出请求的域名。在您的案例中验证两个实例的域名是否相同
  • 路径:如果路径名称相同。Web服务器将上下文根作为路径发送,同一上下文根下的请求共享cookie
  • 安全:服务器发送给定cookie是否安全。也就是说,如果cookie可以在非安全通道上发送
  • 这些参数将允许浏览器向服务器发送cookie并且因为为您拥有的两个实例发送相同的cookie。我认为会话id正在共享

    如果请求属性(如请求URI、域和路径(即上下文根)在请求之间相同,则无法告诉浏览器使用不同的cookie

    下面有一些选项:

          Cookie[] cookies = req.getCookies(); 
            if(cookies!=null) 
            for (int i = 0; i < cookies.length; i++) { 
             cookies[i].setMaxAge(0); 
             context.getResponse().getHttpServletResponse().addCookie(cookies[i]);
            } 
    
        HttpSession myAppSession = req.getSession();//line 1
    
  • 使用不同的域名
  • 使用不同的上下文根
  • 在两个节点前面有一个LB,并根据会话id重定向到正确的节点

  • 谢谢你的回复。在考虑cookie事实后,t重构了代码,但它仍然返回相同的会话id。请参阅原始邮件中的“我的编辑”部分,然后告诉两台服务器的域名是什么。您应该尝试使用不同的域名进行访问。为什么要设置Maxage(0),您不希望Cookie工作吗?服务器是相同的,因此域名也是相同的,即localhost.webapp 1通过链接访问,而link1和link2点击url作为。当服务器相同时,我应该如何使用不同的域名。不确定?将maxage设置为0,以便删除较早的cookie,并为我提供新的会话id。我希望cookie正常工作,但尝试不同的方法,以便以任何方式获得不同的会话id。