如何处理同一主机上的多个jettys上的会话端口 - 动态上下文

时间:2013-04-26 10:39:01

标签: jetty reverse-proxy jsessionid

我有以下要求

  1. 多个JAR。每个运行一个嵌入式Jetty。
  2. 使用反向代理(Apache)
  3. 在同一域/端口上运行每个人
  4. JAR可以在不同的计算机上运行多个实例(但在同一主机/端口下)。
  5. 完成会话分离 - 即使在同一个webapp的2个实例之间也绝对不共享。
  6. 动态缩放所有内容。
  7. 我不知道这是否相关,但我知道其中一些网络应用程序使用的是Spring Security。
  8. 通过添加反向代理规则并重新启动Apache,我完成了所有工作。 以下是webapp-1的2个实例和webapp-2的2个实例的简化描述。

    http://mydomain.com/app1 ==> 1.1.1.1:9099
    http://mydomain.com/app2 ==> 1.1.1.1:9100
    http://mydomain.com/app3 ==> 1.1.1.2:9099
    http://mydomain.com/app4 ==> 1.1.1.2:9100
    

    成功(几乎)成功设置后,我们发现JSESSIONID cookie存在问题。 每个应用程序都会覆盖其他应用程序的cookie - 这意味着我们尚未实现总会话分离,因为一个会影响另一个。

    我在线阅读了很多关于这个问题的内容,但解决方案在我的场景中从未真正满足。

    对我来说,IDEAL解决方案是定义JETTY以使用某种UUID作为cookie名称。我仍然无法弄清楚为什么这不是默认值。

    我甚至会选择JavaScript解决方案。 JavaScript的优点是可以在ReverseProxy操作后看到URL。因此,对于http://mydomain.com/XXX,我可以将Cookie名称定义为XXX_JSESSIONID

    但是我找不到这些的方法。

    那么如何解决这个问题并完全分开会话?

1 个答案:

答案 0 :(得分:1)

您必须花一些时间了解您正在使用的会话管理器以及它为您提供的功能/优势。如果您没有可用的数据库,并且您没有自定义会话管理器,那么我倾向于相信您正在使用我们分发的HashSessionManager,它只能在单个主机上进行会话管理,在此实例中没有跨越jvms的会话共享。

如果您正在运行4个单独的jvm进程(并使用HashSessionManager),因为上面似乎表明没有跨节点共享的会话。

此外,您似乎希望更改每个应用程序的会话ID变量的名称。为此,只需为每个应用程序设置一个不同的名称。

http://www.eclipse.org/jetty/documentation/current/session-management.html

您可以为每个webapp上下文设置一个新的org.eclipse.jetty.servlet.SessionCookie名称,该名称应解决您的直接问题。