58

我需要在单个物理框中运行多个 tomcat 服务器。从浏览器访问这些内容时,当用户在应用程序之间切换时,会导致用户注销之前访问的应用程序。这是因为 JSESSIONID cookie 冲突。

一种可能的解决方案是在不同的上下文中运行每个应用程序。不幸的是,我的应用程序无法在上下文路径设置中工作,因为没有任何资源可以通过前面附加的 request.getContextPath() 访问。

这让我更改 cookie JSESSIONID 的名称来解决冲突。有没有办法做到这一点?如果是,如何?

希望我能清楚地说明我的问题。

注意:我所有的应用程序都在同一台机器的不同端口上运行。

4

8 回答 8

63

Everything is much simpler with Servlet API 3.0.

Now you can configure it in your web.xml:

<session-config>
    <cookie-config>
        <name>MY_JSESSIONID_YAHOOOOOO</name>
    </cookie-config>
</session-config>

That's it!

于 2014-06-06T12:18:03.943 回答
16

以下内容适用于我在 context.xml 文件中的 Tomcat7 上:

<Context path="/yourApp" sessionCookieName="custom_session_id">
于 2013-12-08T03:17:40.563 回答
14

通过使用以下两个系统属性,这可以轻松实现。

  • org.apache.catalina.SESSION_COOKIE_NAME
  • org.apache.catalina.SESSION_PARAMETER_NAME

可以将任何值传递给上述属性以更改默认值。

在这里可以找到带有一些示例脚本的完整详细信息。

于 2010-10-28T04:18:38.280 回答
12

Tomcat 7 将其从 org.apache.catalina.SESSION_COOKIE_NAME 移动到主 <Context> 配置上的属性。 http://tomcat.apache.org/migration-7.html#Session_manager_configuration

于 2012-05-25T13:16:35.810 回答
4

我认为目前不可能 - 请参阅https://issues.apache.org/bugzilla/show_bug.cgi?id=42419

最后一个条目指出“这已在 5.5.x 中修复,并将包含在 5.5.28 以后的版本中”——这是下一个版本——5.5.27 是当前版本。

于 2009-05-18T12:23:32.117 回答
2

不是 100% 确定这是否可行,但您可以使用该jvmRoute属性,该属性通常用于负载平衡/集群环境中,以便负载平衡器能够区分节点。例子:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">

这将最终生成一个类似于“ABCDEF123456.node1”的 JSESSIONID 值。

文档链接

于 2009-05-18T12:56:38.400 回答
0
    final SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig();
    sessionCookieConfig.setSecure(true);
    sessionCookieConfig.setHttpOnly(true);
    // Set __Host- prefix
    sessionCookieConfig.setName("__Host-JSESSIONID");
于 2022-01-21T15:57:09.593 回答
0

我在 /tomcat/conf/server.xml 的 Tomcat 中找到了它

服务器.xml

<Engine name="Catalina" defaultHost="localhost" jvmRoute="instanceName">

5D33F755D8D75EF7C8E840.instanceName

于 2020-09-11T10:33:19.670 回答