【问题标题】:Tomcat7 SESSIONID keep changing after applied redis RedisSessionManager appliesTomcat7 SESSIONID在应用redis RedisSessionManager应用后不断变化
【发布时间】:2019-10-16 19:17:24
【问题描述】:

我在 Ubuntu16.04 中使用 tomcat7 和 oracle-java8。

我启动了 2 个不同的 tomcat 实例进行负载平衡,但默认行为是会话不能在它们之间共享。

所以我转向了在其中使用 RedisSessionManager 的解决方案。

在 tomcat conf/context.xml 文件中添加以下行后(当然我确实在 lib 目录中添加了依赖 jar):

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
             host="127.0.0.1"
             port="6379"
             database="0"
             password="defuRedis2017"
             maxInactiveInterval="60" />

然后启动单个 tomcat 实例。

但在那之后,服务器似乎无法再保存会话,并且在每个请求中返回不同的 Set-Cookie 标头,因此即使使用单个 tomcat 实例也无法登录。

如果我注释掉以上行(在context.xml 文件中),会话将按预期工作。

那么使用RedisSesssionManager 有什么问题呢?

【问题讨论】:

    标签: java session tomcat redis persistence


    【解决方案1】:

    终于我自己找到了重点:

    com.orangefunction.tomcat.redissessions.RedisSessionManager 请勿支持为session-timeout 设置设置-1 值,而默认设置可以。

    就我而言,我的原始web.xml 文件具有以下内容:

    <session-config>
        <session-timeout>-1</session-timeout>
        <cookie-config>
            <max-age>2592000</max-age>
        </cookie-config>
    </session-config>
    

    session-timeout 设置为 -1,这使得会话管理器总是写一个过时的会话,从而导致问题。

    到那时我发现注释掉这部分配置将停止问题,经过一些实验,我发现我们只使用一个大的session-timeout 而不是-1 会使其正常工作:

    <session-config>
        <session-timeout>518400</session-timeout>
        <cookie-config>
            <max-age>2592000</max-age>
        </cookie-config>
    </session-config>
    

    希望对遇到同样问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 2010-09-21
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 2022-11-30
      • 1970-01-01
      • 2012-04-18
      相关资源
      最近更新 更多