Tomcat 7 SESSIONID在应用redis后保持更改RedisSessionManager应用

时间:2019-05-31 06:46:23

标签: java session tomcat redis persistence

我在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实例,登录也无法继续工作。< / p>

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

那么使用RedisSesssionManager会导致什么错误呢?

1 个答案:

答案 0 :(得分:0)

最后,我自己找到了要点:

com.orangefunction.tomcat.redissessions.RedisSessionManager 支持为-1设置一个session-timeout值,而默认值则设置为

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

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

session-timeout设置为-1的情况下,这会使会话管理器始终编写过期的会话,从而导致问题。

到那时,我发现注释掉config的这一部分将解决该问题,并且经过一些实验,我发现我们只是使用较大的session-timeout而不是-1可以使其正常工作:

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

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