我在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
会导致什么错误呢?
答案 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>
希望它对遇到同样问题的人有所帮助。