在加载同一应用程序的不同部署(在不同端口上)后,会重置会话对象

时间:2015-08-05 12:58:03

标签: java tomcat grails

我有两个版本的相同grails应用程序在两个Tomcat实例上运行(并使用两个不同的Javas)但在同一台机器上(在Windows下)。

让我们说:

  • App A1在Tomcat T1上运行,而机器M上的Java J1在端口7224上运行
  • App A2在Tomcat T2上运行,而机器M上的Java J2在端口8080上运行

这是奇怪的行为:

  1. 在一个标签页上加载App A1
  2. 在另一个标签页上加载App A2
  3. 登录A1(我只是通过过滤器生成令牌并将其放在会话中)
  4. 带有A2的刷新标签(未登录)
  5. 使用A1刷新选项卡,我已注销(令牌为空)。
  6. 如果我使用机器M的别名主机名(例如localhost:7224和192.168.1.1:8080),则不会发生这种情况。

    有谁知道会发生什么?

    编辑:found one possible duplicate,但它使用的是tomcat 7(我正在使用Tomcat 8)。那里的答案不适用于我,因为我的catalina具有正确的端口配置。

1 个答案:

答案 0 :(得分:1)

默认情况下,Grails使用cookie来存储会话ID。并且cookie是特定于域的。这就是别名主机名修复问题的原因。试试这个:

  1. 删除别名主机名。
  2. 登录A1
  3. 打开浏览器的Cookie列表,找到192.168.1.1的cookie。您应该看到名为 JSESSIONID 的cookie。记住cookie的数据。
  4. 刷新运行A2的标签。
  5. 再次检查会话cookie。 JSESSIONID 的值可能会有所不同,或者可能为空。
  6. 如何修复

    要解决此问题,您必须让两个应用停止竞争 JSESSIONID 名称。

    对于Tomcat8,在{tomcat}/conf/context.xml中,<Context>节点可能为空。这使会话cookie名称默认为 JSESSIONID 。解决方案是明确设置sessionCookieName

    它应如下所示:

    <?xml version='1.0' encoding='utf-8'?>
    <Context sessionCookieName="SESSION8080">
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    </Context>
    

    您要对其他应用<Context sessionCookieName="SESSION7224">

    进行类似的更改