java - 用于 tomcat 的分布式 HTTP session 状态服务器

标签 java spring session tomcat

我们的一个 Spring MVC Web 应用程序部署在多个带有 tomcat 7 的 Web 服务器上,LB 位于前端以平衡请求并将请求分发到适当的 tomcat 服务器。

这种 web farming 的问题是每个 tomcat 服务器都能够存储和检索自己的 HTTP session ,但是 LB 可以向任何一个 web 服务器发送请求。因此,如果通过 tomcatServer1 为用户提供登录页面,那么它将在其受尊重的服务器上创建 HTTP session ,并且可能会发生仪表板页面的第二次请求,LB 将其发送到 HTTP session 不可用的 tomcatServer2,结果用户再次被重定向登录页面。

为了克服这个问题,

  1. 我们在 LB 上使用“Sticky Session”属性,这样如果用户(HTTP session + 用户的公共(public) IP)第一次从 tomcatServer1 获得服务,那么它将绑定(bind)到该服务器。设置“粘性 session ”没有帮助,因为它没有平等地利用所有服务器。
  2. 另一种方法是,开发我们自己的 session 状态服务器并部署在服务器上,然后所有服务器都应与该服务器通信以存储和检索 session 对象/数据。
  3. 提供定制SessionManager到 Servlet 容器。

关于 #2,如果我们能够开发状态服务器,那么我也必须修改与 HttpSession.setAttribute() 相关的代码和 HttpSession.getAttribute() . 所以问题是,是否可以覆盖 HttpSession 的实现?对于方法 setAttribute 和 getAttribute? 还有关于 #3,我不知道这个解决方案是否会提供分布式状态 session 服务器?

最佳答案

我开发了session state server对于使用 python 的 tomcat。

因此,我不需要更改已经为创建/访问和销毁 session 编写的代码。此外,由于有单独的服务器/服务正在处理和存储 session ,因此不需要主集群。

关于java - 用于 tomcat 的分布式 HTTP session 状态服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47634411/

相关文章:

java - 如何在 Spark 本身内部使用 Kafka 实现 Spark 流中的偏移管理?

java - 通过 Intent.putExtra 发送字节数组不起作用

java - Spring 批处理 : not able to access jobexecutionConext in flatfileitemwriter

java - 如何在 OpenScript 中获取结果文件夹的当前 session 数?

java - 不要在每个请求上打开一个新的连接mongodb java驱动程序

java - 在react-native run-android期间安装Gradle时出现SSL错误

spring - 在grails集成测试中创建的 protected 用户是未经授权的,但被引导用户是

java - Spring boot + Hibernate + SqlAzure 分页问题

node.js - Passport 不会跨浏览器请求持久存在,可与 Postman 一起使用

ruby - Ramaze Session 中的复杂或深层对象存储坏了?