一尘不染

当请求来自网络服务器而不是网络浏览器时,如何创建HTTPSession?

tomcat

我有一个非常基本的问题,即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。但是它没有发生吗?


阅读 455

收藏
2020-06-16

共1个答案

一尘不染

我认为这是您要寻找的

默认情况下, 会话跟踪由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,然后根据会话ID重定向到正确的节点
2020-06-16