小编典典

同一IP地址但不同端口上的两台服务器之间的JSESSIONID冲突

java

我遇到的情况是,我在同一台服务器上使用不同的端口运行两个不同的Web应用程序。它们都在运行Java的Jetty
servlet容器,因此它们都使用名为JSESSIONID的cookie参数来跟踪会话ID。这两个Web应用程序正在争用会话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);get时null。如果我打电话给req.getSession(true)我一个新的Session对象,但是WebApp2的HTTP响应中有一个set-cookie头,其JSESSIONID = 20
  • 现在,WebApp2具有正常工作的会话,但WebApp1的会话已消失。转到WebApp1将给我一个新的会话,使WebApp2的会话中断。
  • 永远继续

因此,每个Web应用程序之间的Session都会发生混乱。req.getSession(false)如果已经定义了JSESSIONID
cookie,我真的很想返回一个有效的会话。

一种选择是基本上使用HashMap和称为WEBAPP1SESSIONID和WEBAPP2SESSIONID的cookie重新实现Session框架,但这很糟糕,这意味着我将不得不将新的Session内容侵入ActionServlet和其他一些地方。

这一定是其他人遇到的问题。码头HttpServletRequest.getSession(boolean)只是cr脚吗?


阅读 383

收藏
2020-11-16

共1个答案

小编典典

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

一段时间后,我想到了这个:

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

这样,我为每个实例使用不同的Cookie名称-因此不再受到干扰。

2020-11-16