【问题标题】:How the creation of HTTPSession works when request is coming from webserver instead of web browser?当请求来自网络服务器而不是网络浏览器时,HTTPSession 的创建如何工作?
【发布时间】:2012-02-27 16:12:57
【问题描述】:

我有一个非常基本的问题,如何创建 HTTPSession 问题存在。但是我问这个问题是有原因的:-

我知道 httpsession 是 Web 浏览器独有的,当我们第一次执行 HttpServletRequest.getSession 时,服务器会创建它。它将保持相同的会话,直到我们 关闭浏览器。但我有一点不同的场景。我在一个 tomcat 实例上有一个 Web 应用程序说 T1。在这个 Web 应用程序的欢迎页面上 我提供了两个点击链接,将我带到另一个tomcat实例T2上托管的不同Web应用程序的相同java servlet(S1)(这两个链接 打开两个单独的弹出窗口)。现在首先我单击链接 1 并检查 S1 中的 sessionId 并找到它的值为 1678。现在首先我单击链接 2 并 检查 S1 中的 sessionId 并再次找到它的值 1678。我的问题是为什么我得到的两个请求的会话 ID 相同 从链接1和链接2?我该怎么做才能为这两个请求获得不同的会话?

我在网上寻找可能的解决方案后尝试了什么:-点击链接1,在 Servlet S1 中,我复制了会话属性,使其无效并创建新的。 假设新会话 id 是 8765 。现在我单击链接 2 并在此请求中找到相同的会话。所以我进一步使其无效并创建新的(比如说 新会话 ID 为 4897)。理想情况下,它应该使第一个浏览器会话过期(单击链接 1 时生成)。为了验证它,我点击弹出窗口 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。但它没有发生?

【问题讨论】:

    标签: java session web-applications tomcat servlets


    【解决方案1】:

    我想这就是你要找的东西

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

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

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

    这些参数会让浏览器将cookies发送到服务器。 因为您拥有的两个实例都发送了相同的 cookie。我认为会话 ID 正在共享

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

    您有以下几种选择:

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

    【讨论】:

    • 拉梅什感谢您的回复。在考虑了 cookie 事实之后,t 重构了代码,但它仍然返回相同的会话 id。在原始帖子中查看我的编辑部分
    • 你能说出两台服务器的域名是什么吗?
    • 你应该尝试使用不同的域名访问。
    • 你为什么要设置MaxAge(0),你不想让cookies工作?
    • 服务器相同,因此域名也相同,即通过链接 localhost:8080/myWebApp/login.do 访问 localhost.webapp 1,并且链接 1 和链接 2 将 URL 设为 localhost:8888/wiki/bin/view/Main/WebHome。当服务器相同时,我如何使用不同的域名。不确定?将 maxage 设置为 0,以便删除较早的 cookie,并为我提供新的会话 ID。我希望 cookie 工作,但尝试不同的方式,以便以任何方式获得不同的会话 ID。
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多