11

我有一种情况,我有两个不同的 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)很烂?

4

6 回答 6

3

I had a similar problem: One or more instances of the same application on localhost on different ports, choosen at application start time, each using its own jetty instance.

After a while, I came up with this:

  • Wait for jetty to initialize
  • use jetty's SocketManager to get the port (socketManager.getLocalPort())
  • set the cookie name through the SessionManager (sessionHandler.getSessionManager().setSessionCookie(String))

This way I have a difference cookie name for each instance - thus no interference anymore.

于 2010-06-09T15:29:36.400 回答
3

这不是 Jetty 的问题,而是 cookie 规范的定义方式。除了名称/值对之外,cookie 还可能包含到期日期、路径、域名以及 cookie 是否安全(即仅用于 SSL 连接)。端口号未在上面列出;-) 因此,正如 stepancheg 在他的回答中所说,您需要更改路径或域。

于 2009-07-18T11:39:35.753 回答
3

在我们的例子中,我们使用的是 Tomcat,因此解决方案是在每个实例上使用不同的会话 cookie 名称。

context.xml做类似的事情

<Context sessionCookieName="JSessionId_8080">
于 2015-10-23T20:07:47.600 回答
1

我一直在挖掘,我发现在 中AbstractSessionManager,有一个方法叫做getCrossContextSessionIDs(). 如果返回true,则在创建新会话时,Jetty 将首先检查是否设置了 JSESSIONID,并尝试使用该现有会话 ID。我想我可以将值设置为true在启动时使用某种 java 属性。

在进一步挖掘中,这只会在我在同一个 Jetty 的不同上下文中运行两个 web 应用程序时对我有帮助(因此,跨上下文)。创建新Session对象时,JSESSIONID会选择一个新值。如果getCrossContextSessionIDs()返回true,那么它将检查当前JSESSIONID值是否由该 Jetty(包括所有其他上下文)创建,如果是,它将重用它。

由于我正在处理在两个不同端口上运行的两个不同的 Jetty 实例,因此我需要破解 Jetty 的源代码以不进行该检查,或者只是制作我自己的类似会话的框架。

于 2009-07-20T15:07:44.810 回答
0

这是正确的行为。您可以将两个 Web 应用程序放置到不同的域或通过不同的路径。

于 2009-07-17T23:35:37.200 回答
0

我相信你也可以设置 jsessionid cookie 路径。

于 2009-07-18T04:25:19.327 回答