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