Tomcat与redisson的非粘性会话

时间:2017-09-28 15:31:51

标签: session tomcat redis redisson

尝试使用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仍然设置。我刷新了几次以回到第一台服务器,我仍然登录。

关于我缺少什么的任何想法?

1 个答案:

答案 0 :(得分:1)

更新

我的应用程序正在使用HttpServletRequest.login()方法进行用户登录。此方法使先前的会话用户无效,并出于安全原因在登录后创建新会话。 用户登录时会话的这种变化造成了用户永远无法登录的问题。当我删除HttpServletRequest.login()方法时,即使登录后用户也可以正常登录并维护会话。

简而言之,如果您使用HttpServletRequest.login(),则Redisson不能正常工作。


我分叉了redisson项目(您可以在下面找到链接),并做了一些自己的更改。我不知道它们是否最佳,但对我来说效果很好。 我和你一样面临同样的情况。以下是我的设置

  1. 两个配置了3个redisson前哨的雄猫。
  2. 在两个tomcat前面的一个IIS负载平衡器,用于进行循环负载平衡。

问题: 当用户尝试登录到Web应用程序时,登录的第一个请求似乎到达了第一个tomcat,并且在登录后页面刷新后,由于轮循机制的平衡,第二个请求似乎击中了第二个tomcat。 Redisson无法以某种方式无法通过第一个tomcat提取存储在redis中的会话,并在页面刷新并且请求转到第二个tomcat时提供服务。但是,redisson创建了第二个空会话,并且用户从未登录。

解决方案: 如果redisson无法使用当前的catalina managerBase查找会话,则在redis本身中搜索该会话,如果能够找到它,则使其可用并填充该检索到的会话中的所有会话属性。此外,如果redis中不存在会话,则redisson可以继续创建新会话。

更改是RedissonSession.java中的load方法和tomcat 8文件夹中RedissonSessionManager.java文件中的findSession方法。

P.S。尚未针对最佳性能和其他问题进行测试,但是到目前为止,这似乎可以解决我遇到的问题。任何评论和分叉都表示赞赏。

redisson forked library