代码之家  ›  专栏  ›  技术社区  ›  Steve Armstrong

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

  •  11
  • Steve Armstrong  · 技术社区  · 15 年前

    我曾经遇到过这样一种情况:在一台服务器上运行两个不同的Web应用程序,使用不同的端口。他们都在运行Java的Jetty servlet容器,所以他们都使用一个名为JSESSIONID的cookie参数来跟踪会话id。这两个Web应用程序正在为会话id而争吵。

    • WebApp1的HTTP响应有一个设置cookie头,其JSESSIONID=1
    • Firefox现在在对WebApp1的所有HTTP请求中都有一个JSESSIONID=1的Cookie头
    • 打开第二个Firefox选项卡,然后转到WebApp2
    • req.getSession(false); 我明白了 null . 如果我打电话 req.getSession(true)
    • 现在,WebApp2有一个工作会话,但WebApp1的会话已不存在。转到WebApp1将给我一个新的会话,取消WebApp2的会话。
    • 永续

    因此,会话在每个web应用程序之间来回切换。我真的很想去看电影 req.getSession(false) 如果已经定义了JSESSIONID cookie,则返回有效会话。

    这一定是其他人遇到的问题。是杰蒂的吗 HttpServletRequest.getSession(boolean) 只是很糟糕?

    6 回复  |  直到 15 年前
        1
  •  3
  •   Vinay Sajip    15 年前

        2
  •  3
  •   Moritz Both    14 年前

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

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

    这样,每个实例都有一个不同的cookie名称,因此不再有干扰。

        3
  •  3
  •   aij    9 年前

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

    在里面 context.xml 做点像

    <Context sessionCookieName="JSessionId_8080">
    
        4
  •  1
  •   Steve Armstrong    15 年前

    我一直在挖掘,我在 AbstractSessionManager getCrossContextSessionIDs() . 如果它回来 true ,然后在创建新会话时,Jetty将首先检查是否设置了JSESSIONID,并尝试使用该现有会话id。我认为可以将值设置为 符合事实的

    进一步挖掘,只有当我在同一个Jetty的不同上下文中运行两个webapp(因此,跨上下文)时,这才有助于我。当创建一个新的 Session 对象,一个新的 JSESSIONID 选择值。如果 GetCrossContextSessionId() 符合事实的 ,然后它将检查当前 JSESSIONID

    因为我要处理两个不同的Jetty实例,它们运行在两个不同的端口上,所以我需要破解Jetty的源代码,以避免进行这种检查,或者只是创建自己的类似于会话的框架。

        5
  •  0
  •   stepancheg    15 年前

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

        6
  •  0
  •   John Doe    15 年前

    我相信,您还可以设置jsessionid cookie路径。