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

M S*_*ach 6 java session tomcat servlets web-applications

我有一个非常基本的问题,即如何创建HTTPSession.我知道你们会因为类似的问题存在而解雇这个问题.但是有理由我为什么要问这个问题这里是: -

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

在网上寻找可能的解决方案后我尝试了什么: -点击link1,在Servlet S1中,我复制会话属性,使其无效并创建新的属性.说新的会话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
Run Code Online (Sandbox Code Playgroud)

假设点击link1我得到会话ID为1234,然后点击链接2后我也得到相同的会话ID.根据我的理解,在执行第1行上面的代码后,我应该获得不同的会话ID,因为我在获取会话之前将MaxAge设置为0.但它没有发生?

Ram*_*PVK 12

我认为这就是你要找的东西:

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

浏览器如何识别要为链接/请求发送的cookie? 它基于这些参数.如果请求与这些参数匹配,则浏览器会发送该特定cookie:

  1. 域:请求所针对的域名.在您的情况下验证两个实例的域名是否相同
  2. 路径:如果路径名相同.Web Server将上下文根作为路径发送,请求在相同的上下文根共享cookie下.
  3. 安全:如果给定的cookie是安全的,服务器会发送.这意味着,如果cookie可以在非安全通道上发送.

这些参数将允许浏览器将cookie发送到服务器.并且因为您正在为两个实例发送相同的cookie.我认为会话ID正在共享.

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

您有以下几种选择:

  1. 使用不同的域名.
  2. 使用不同的上下文根.
  3. 在两个节点前面有一个LB,并根据Session id重定向到正确的节点