Session Tomcat与redisson的非粘性会话

Session Tomcat与redisson的非粘性会话,session,tomcat,redis,redisson,Session,Tomcat,Redis,Redisson,尝试使用redis设置具有非粘性会话的tomcat集群 正在尝试使用: 添加了2个jar文件。使用Tomcat7 context.xml: <Manager className="org.redisson.tomcat.RedissonSessionManager" configPath="${catalina.base}/conf/redisson.yml" readMode="REDIS" --- senti

尝试使用redis设置具有非粘性会话的tomcat集群

正在尝试使用:

添加了2个jar文件。使用Tomcat7

context.xml:

   <Manager className="org.redisson.tomcat.RedissonSessionManager"
                 configPath="${catalina.base}/conf/redisson.yml"
                 readMode="REDIS"
---
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

更新:

   <Manager className="org.redisson.tomcat.RedissonSessionManager"
                 configPath="${catalina.base}/conf/redisson.yml"
                 readMode="REDIS"
---
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
我的应用程序使用HttpServletRequest.login()方法进行用户登录。此方法会使上一个会话用户处于启用状态,并在登录后出于安全原因创建新会话。 用户登录时会话的这种更改造成了用户永远无法登录的问题。当我删除HttpServletRequest.login()方法时,用户就可以很好地登录并在登录后维护会话

简而言之,如果使用HttpServletRequest.login(),Redisson无法正常工作


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

  • 两个配置了3个redisson sentinel的tomcat
  • 一个IIS负载平衡器在两个Tomcat前面,这两个Tomcat正在进行循环负载平衡
  • 问题: 当用户尝试登录到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。@新手我无法使用会话。所以当时它刚刚被丢弃。所以我真的没有答案给你。无论如何,我们都在重新编程整个解决方案,所以我想我们会在那个时候重新考虑。有很多插件,但我永远都无法让它们工作。谢谢@Matt。我最终编辑了redisson tomcat库,现在对我来说很好。酷!谢谢分享!