我有一种情况,我有两个不同的 web 应用程序在单个服务器上运行,使用不同的端口。它们都运行 Java 的 Jetty servlet 容器,因此它们都使用名为 JSESSIONID 的 cookie 参数来跟踪会话 ID。这两个 webapps 正在争夺会话 ID。
- 打开 Firefox 选项卡,然后转到 WebApp1
- WebApp1 的 HTTP 响应有一个 JSESSIONID=1 的 set-cookie 标头
- Firefox 现在在对 WebApp1 的所有 HTTP 请求中都有一个 JSESSIONID=1 的 Cookie 标头
- 打开第二个 Firefox 选项卡,然后转到 WebApp2
- WebApp2 的 HTTP 请求也有一个 JSESSIONID=1 的 Cookie 标头,但在 doGet 中,当我调用时,
req.getSession(false);
我得到了null
. 如果我打电话req.getSession(true)
,我会得到一个新的 Session 对象,但是来自 WebApp2 的 HTTP 响应有一个 JSESSIONID=20 的 set-cookie 标头 - 现在,WebApp2 有一个工作会话,但 WebApp1 的会话消失了。转到 WebApp1 会给我一个新的会话,吹走 WebApp2 的会话。
- 永远继续
所以会话在每个网络应用程序之间颠簸。如果已经定义了 JSESSIONID cookie ,我真的很想req.getSession(false)
返回一个有效的会话。
一种选择是使用 HashMap 和称为 WEBAPP1SESSIONID 和 WEBAPP2SESSIONID 的 cookie 基本上重新实现 Session 框架,但这很糟糕,这意味着我必须将新的 Session 内容破解到 ActionServlet 和其他一些地方。
这一定是其他人遇到的问题。Jetty是不是HttpServletRequest.getSession(boolean)
很烂?