【发布时间】:2018-06-03 19:19:37
【问题描述】:
我们的一个 Spring MVC Web 应用程序部署在多个带有 tomcat 7 的 web 服务器上,LB 位于前端以平衡请求并将请求分发到适当的 tomcat 服务器。
这个网络农场的问题是每个 tomcat 服务器都能够存储和检索自己的 HTTP 会话,但 LB 可以向任何一个网络服务器发送请求。因此,如果通过 tomcatServer1 为用户提供登录页面,那么它将在其受尊重的服务器上创建 HTTP 会话,并且可能会发生仪表板页面 LB 的第二次请求将其发送到 HTTP 会话不可用的 tomcatServer2,导致用户再次被重定向到登录页面。
为了克服这个问题,
- 我们在 LB 上使用“Sticky Session”属性,这样如果用户(HTTP 会话 + 用户的公共 IP)第一次从 tomcatServer1 提供服务,那么它将绑定到该服务器。设置“粘性会话”没有帮助,因为它没有平等地利用所有服务器。
- 另一种方法是,开发我们自己的会话状态服务器并部署在服务器上,然后所有服务器都应与该服务器通信以存储和检索会话对象/数据。
- 为 Servlet Container 提供自定义 SessionManager。
关于#2,如果我们能够开发状态服务器,那么我还必须修改与HttpSession.setAttribute()和HttpSession.getAttribute()相关的代码。 所以问题是,是否可以为 setAttribute 和 getAttribute 方法覆盖 HttpSession 的实现? 另外关于#3,我不知道这个解决方案是否会提供分布式状态会话服务器?
【问题讨论】:
标签: java spring session tomcat