java - Tomcat HttpSession Cookie 共享

标签 java tomcat servlets session-cookies

我有几个运行在不同服务器上的相同 Web 应用程序的独立实例(所有实例都具有不同的面向公众的 IP)。我利用 session 来存储当前登录的用户信息。

HttpSession session = req.getSession(true);     

User user = (User)session.getAttribute("user");
if (user == null) {
  // get my user
  session.setMaxInactiveInterval(....);
  session.setAttribute("user", user);
}

问题是,当我登录到一个实例(称为实例 1)然后登录到另一个实例(实例 2)时,当我切换到实例 1 时,它会获取实例 2 的 cookie,这显然会产生问题当实例 1 上不存在这样的 id 的用户时,更糟糕的是,当它默默地找到与该 id 匹配的用户时..

我查看了 cookie,只有一个 JSESSIONID cookie 是用“localhost”域创建的,并且与所有实例共享。有没有办法让Tomcat设置域为 native 域?

我正在运行 Tomcat 6.0.35

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

您可以将defaultHost 更改为服务器的主机名(或网络名称)。
看一下 Tomcat 的 conf/server.xml 配置文件:

<Engine ... defaultHost="myserver">

然后你还需要改变:

<Host ... name="myserver">

参见:
http://tomcat.apache.org/tomcat-6.0-doc/config/engine.html
http://tomcat.apache.org/tomcat-6.0-doc/config/host.html

作为另一种可能的解决方案,您可以将 jvmRoute 定义为每个实例的“唯一名称”。

<Engine ... jvmRoute="instance1">

这将生成一个 JSESSIONID,如下所示:

C85262796BE5F656BD8EF58A96F03C96.instance1

关于java - Tomcat HttpSession Cookie 共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790549/

相关文章:

java - Spring boot 构建变体 使用 gradle 的配置文件特定属性

java - 带管道的 Ant 运行命令

java - 登录后 session ID 更改和属性复制

java - 带有 Maven 的 Tomcat7,未应用 contextReloadable

tomcat - 尝试在露天移动内容存储时出错

java - 更改 Init() 上的 servlet 位置

java - 计算类实例时将类作为参数

java - 原理是什么? Spark 何时处理大于内存容量的数据?

java - 为什么servlet中没有构造函数?

java - 如何使用 spring 以编程方式调用 GET/POST 方法