gpt4 book ai didi

java - 同一 IP 但不同端口上的两个服务器之间的 JSESSIONID 冲突

转载 作者:搜寻专家 更新时间:2023-10-30 21:30:17 30 4
gpt4 key购买 nike

我遇到过这样一种情况,我有两个不同的 Web 应用程序在一台服务器上运行,使用不同的端口。它们都在运行 Java 的 Jetty servlet 容器,因此它们都使用名为 JSESSIONID 的 cookie 参数来跟踪 session ID。这两个 web 应用程序正在争夺 session ID。

  • 打开 Firefox 选项卡,然后转到 WebApp1
  • WebApp1 的 HTTP 响应有一个带有 JSESSIONID=1 的 set-cookie header
  • Firefox 现在在对 WebApp1 的所有 HTTP 请求中都有一个 JSESSIONID=1 的 Cookie header
  • 打开第二个 Firefox 选项卡,然后转到 WebApp2
  • WebApp2 的 HTTP 请求也有一个 JSESSIONID=1 的 Cookie header ,但在 doGet 中,当我调用 req.getSession(false); 时,我得到 null .如果我调用 req.getSession(true),我会得到一个新的 Session 对象,但是来自 WebApp2 的 HTTP 响应有一个带有 JSESSIONID=20 的 set-cookie header
  • 现在,WebApp2 有一个工作 session ,但 WebApp1 的 session 已经消失。转到 WebApp1 会给我一个新的 session ,从而取消 WebApp2 的 session 。
  • 永远继续

因此 session 在每个网络应用程序之间颠簸。如果已经定义了 JSESSIONID cookie,我真的希望 req.getSession(false) 返回有效 session 。

一个选项基本上是使用 HashMap 和名为 WEBAPP1SESSIONID 和 WEBAPP2SESSIONID 的 cookie 重新实现 Session 框架,但这很糟糕,并且意味着我必须将新的 Session 内容破解到 ActionServlet 和其他一些地方。

这一定是别人遇到过的问题。 Jetty 的 HttpServletRequest.getSession(boolean) 很糟糕吗?

最佳答案

我有一个类似的问题:同一应用程序的一个或多个实例在不同端口的本地主机上,在应用程序启动时选择,每个实例都使用自己的 jetty 实例。

过了一会儿,我想到了这个:

  • 等待 jetty 初始化
  • 使用jetty的SocketManager获取端口(socketManager.getLocalPort())
  • 通过 SessionManager (sessionHandler.getSessionManager().setSessionCookie(String)) 设置 cookie 名称

这样我就可以为每个实例使用不同的 cookie 名称 - 因此不再有干扰。

关于java - 同一 IP 但不同端口上的两个服务器之间的 JSESSIONID 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1146112/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com