有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个非常基本的问题,HTTPSession的创建是如何工作的。我知道当你们把这个问题看成类似的问题时,你们会解雇我的 存在许多问题。但我提出这个问题的原因是:-

我知道httpsession是web浏览器独有的,服务器在执行HttpServletRequest时创建它。第一次使用getSession。它将保持相同的会话,直到我们 关闭浏览器。但我有一点不同的情况。我在一个tomcat实例上有一个web应用程序,比如T1。在此web应用程序的欢迎页面上 我在点击时提供了两个链接,这两个链接将我带到托管在另一个tomcat实例T2上的不同web应用程序的同一个Javaservlet(S1)(这两个链接 打开两个单独的弹出窗口)。现在我首先单击link1并检查S1中的sessionId,发现它的值为1678。现在,我首先单击链接2和 检查S1中的sessionId并再次找到其值,即1678我这里的问题是,为什么我得到的两个原始请求的会话id相同 来自link1和link2?如何才能为这两个请求获得不同的会话

我在网上寻找可能的解决方案后尝试了什么:-在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。但它没有发生吗


共 (1) 个答案

  1. # 1 楼答案

    我想这就是你要找的

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

    浏览器如何识别发送链接/请求的cookie 它是基于这些参数。如果请求与这些参数匹配,浏览器将发送特定的cookie

    1. 域:向其发出请求的域名。在您的案例中验证两个实例的域名是否相同
    2. 路径:如果路径名称相同。Web服务器将上下文根作为路径发送,同一上下文根下的请求共享cookie
    3. 安全:服务器发送给定cookie是否安全。也就是说,如果cookie可以在非安全通道上发送

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

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

    下面有一些选项:

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