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

我有一个非常基本的问题,如何创建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时生成)。 为了validation它,我点击弹出的任何地方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 

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

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

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

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

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

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

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

你有以下几种选择:

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