我有一个非常基本的问题,即HTTPSession的创建是如何工作的。我知道你们会因为存在类似问题而解雇我。但是有理由我问这个问题,这里是:-
我知道httpsession对于Web浏览器是唯一的,服务器在第一次执行HttpServletRequest.getSession时会创建它,它将保持相同的会话,直到我们关闭浏览器为止。但是我有一些不同的情况。我在一个tomcat实例上有一个Web应用程序,例如T1。在此Web应用程序的欢迎页面上,我提供了两个链接,单击它们可以将我带到托管的不同Web应用程序的同一个Java servlet(S1)在另一个tomcat实例T2上(这两个链接打开了两个单独的弹出窗口)。现在,我首先单击link1并检查S1中的sessionId,然后将其值查找为1678。现在,我首先单击link2并检查S1中的sessionId,然后再次将其值查找为1678。 我的问题是,为什么我从link1和link2都收到相同的会话ID? 我该怎么做才能为这两个请求获取不同的会话?
在网上寻找可能的解决方案后,我尝试了以下操作:- 单击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
假设单击链接1,我得到的会话ID为1234,然后单击链接2之后,我也得到了相同的会话ID。根据我的理解,在执行第1行以上的代码后,我应该获取不同的会话ID,因为我在获取会话之前将MaxAge设置为0。但是它没有发生吗?
我认为这是您要寻找的 :
默认情况下, 会话跟踪由Cookie进行 。 WebServer以cookie的形式将会话ID发送到浏览器 。并且, 浏览器发送具有用于后续请求的会话ID的cookie 。
浏览器如何识别要发送链接/请求的cookie? 它基于这些参数。如果 请求与这些参数匹配,则浏览器将发送该特定Cookie :
这些参数将使浏览器将cookie发送到服务器。 并且因为您拥有的两个实例都发送相同的cookie。 我认为会话ID正在共享。
如果请求之间的请求属性(例如请求URI,域和路径(即上下文根))相同,则无法告诉浏览器使用不同的cookie。
您可以在下面选择一些方法: