【问题标题】:How to handle sessions on multiple jettys on same host & port - dynamic contexts如何在同一主机和端口上处理多个码头上的会话 - 动态上下文
【发布时间】:2013-04-26 10:39:00
【问题描述】:

我有以下要求

  1. 多个 JAR。每个都运行一个嵌入式 Jetty。
  2. 在同一域/端口上运行所有人 - 使用反向代理 (Apache)
  3. 一个 JAR 可以有多个实例在不同的机器上运行(但在相同的主机/端口下)。
  4. 完全会话分离 - 即使在同一个 webapp 的 2 个实例之间也绝对不能共享。
  5. 动态缩放这一切。
  6. 我不知道这是否相关,但我知道其中一些 Web 应用程序使用了 Spring Security。

我通过添加反向代理规则并重新启动 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——这意味着我们还没有实现完全的会话分离,因为一个会影响另一个。

我在网上阅读了很多关于此问题的信息,但解决方案在我的场景中永远不够用。

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

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

但是我找不到关于这些的操作方法。

那么我该如何解决这个问题并完全分离会话呢?

【问题讨论】:

  • 您使用什么进行会话管理? Jetty 的 JDBC 会话、默认的哈希会话管理器、mongo……一个自定义的?
  • 据我所知默认。我可以在浏览器中看到 JSESSIONID cookie。我根本没有可用的数据库。我还没有编写自定义会话管理器。

标签: jetty reverse-proxy jsessionid


【解决方案1】:

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

如果您正在运行 4 个单独的 jvm 进程(并使用 HashSessionManager),如上所示,则没有跨节点共享会话。

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

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

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

【讨论】:

  • 嗨。我可能正在使用 HashSessionManager。但正如我的问题中所指定的,更改上下文是不合适的。我需要一些更有活力的东西。是否有一个我可以传递的 JVM 参数会做同样的事情?会话不共享 - 更糟糕的是,它们被覆盖。当我访问 app2 时,我退出了 app1。我假设适当的生产项目定义了不同的 cookie 名称。这对 Spring 安全性有何影响?是否有硬编码名称“JSESSIONID”的模块?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多