尝试使用redis设置具有非粘性会话的tomcat群集。
尝试使用: https://github.com/redisson/redisson/wiki/14.-Integration%20with%20frameworks#145-spring-session
添加了2个jar文件。使用Tomcat 7。
context.xml中:
<Manager className="org.redisson.tomcat.RedissonSessionManager"
configPath="${catalina.base}/conf/redisson.yml"
readMode="REDIS"
redisson.yml:
---
sentinelServersConfig:
idleConnectionTimeout: 10000
pingTimeout: 1000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
reconnectionTimeout: 3000
failedAttempts: 3
password: null
subscriptionsPerConnection: 5
clientName: null
loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
subscriptionConnectionMinimumIdleSize: 1
subscriptionConnectionPoolSize: 50
slaveConnectionMinimumIdleSize: 10
slaveConnectionPoolSize: 64
masterConnectionMinimumIdleSize: 10
masterConnectionPoolSize: 64
readMode: "SLAVE"
subscriptionMode: "SLAVE"
sentinelAddresses:
- "redis://redis-sentinel:26379"
masterName: "redismaster"
database: 0
threads: 0
nettyThreads: 0
codec: !<org.redisson.codec.JsonJacksonCodec> {}
useLinuxNativeEpoll: false
Redis起来了。它找到了服务器。我没有看到任何错误。
现在我去说经理测试。它将进行循环负载平衡。我登录到第一台服务器,然后我得到一个会话。我刷新,它似乎没有拉出正确的会话,并且表现得像我从未登录过。该cookie仍然设置。我刷新了几次以回到第一台服务器,我仍然登录。
关于我缺少什么的任何想法?
答案 0 :(得分:1)
更新:
我的应用程序正在使用HttpServletRequest.login()方法进行用户登录。此方法使先前的会话用户无效,并出于安全原因在登录后创建新会话。 用户登录时会话的这种变化造成了用户永远无法登录的问题。当我删除HttpServletRequest.login()方法时,即使登录后用户也可以正常登录并维护会话。
简而言之,如果您使用HttpServletRequest.login(),则Redisson不能正常工作。
我分叉了redisson项目(您可以在下面找到链接),并做了一些自己的更改。我不知道它们是否最佳,但对我来说效果很好。 我和你一样面临同样的情况。以下是我的设置
问题: 当用户尝试登录到Web应用程序时,登录的第一个请求似乎到达了第一个tomcat,并且在登录后页面刷新后,由于轮循机制的平衡,第二个请求似乎击中了第二个tomcat。 Redisson无法以某种方式无法通过第一个tomcat提取存储在redis中的会话,并在页面刷新并且请求转到第二个tomcat时提供服务。但是,redisson创建了第二个空会话,并且用户从未登录。
解决方案: 如果redisson无法使用当前的catalina managerBase查找会话,则在redis本身中搜索该会话,如果能够找到它,则使其可用并填充该检索到的会话中的所有会话属性。此外,如果redis中不存在会话,则redisson可以继续创建新会话。
更改是RedissonSession.java中的load方法和tomcat 8文件夹中RedissonSessionManager.java文件中的findSession方法。
P.S。尚未针对最佳性能和其他问题进行测试,但是到目前为止,这似乎可以解决我遇到的问题。任何评论和分叉都表示赞赏。