Tomcat7 SESSIONID 在应用后不断变化 redis RedisSessionManager 应用

Tomcat7 SESSIONID keep changing after applied redis RedisSessionManager applies

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

我启动了 2 个不同的 tomcat 实例用于负载平衡,但默认行为是 session 无法在它们之间共享。

所以我转向了使用 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 实例。

但是之后服务器好像不能保存session了,每次请求都返回了不同的Set-Cookieheader,因此即使使用单个 tomcat 实例登录也无法再工作。

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

那么使用 RedisSesssionManager 是什么错误?

最后我自己找到了重点:

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,这使得会话管理器总是写入 out-dated 会话,从而导致问题。

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

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

希望对遇到同样问题的小伙伴有所帮助。