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

标签 java session tomcat redis persistence

我在 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/

相关文章:

java - 从 apache HttpResponse java 获取重定向 Uri

java - 使用 FOR 循环捕获相同数字的倍数

php - 将客户的邮政地址存储在 cookie 中是一种好的做法吗?

java - 解析日志文件,Apache Tomcat

mysql - HTTP 500 - 内部服务器错误 - 部署示例 Tomcat Web 应用程序

java - 防止 JavaFX 线程死于 JFXPanel Swing 互操作?

java - 从用户 Java 输入中获取首字母

java - Android Facebook sdk Session.OpenRequest(myFragment) 未定义?

node.js - 浏览器未设置 CORS cookie,响应中存在 cookie

java - nginx 和 tomcat ssl 问题 - SSL23_GET_SERVER_HELLO :sslv3 alert handshake failure