我在 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-Cookie header ,因此即使使用单个 tomcat 实例也无法登录。
如果我注释掉上面的行(在 context.xml
文件中), session 将按预期工作。
那么使用 RedisSessionManager
有什么问题呢?
最佳答案
最后我自己找到了重点:
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 管理器总是写入过时的 session ,从而导致问题。
到那时我发现注释掉这部分配置将停止问题,经过一些实验,我发现我们只是使用一个大的 session-timeout
而不是 -1
将使其正常工作:
<session-config>
<session-timeout>518400</session-timeout>
<cookie-config>
<max-age>2592000</max-age>
</cookie-config>
</session-config>
希望对遇到同样问题的小伙伴有所帮助。
关于java - Tomcat7 SESSIONID在应用redis RedisSessionManager应用后不断变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56390007/