当前位置: 代码迷 >> 综合 >> 解决session共享问题
  详细解决方案

解决session共享问题

热度:89   发布时间:2023-10-21 15:19:47.0

项目原结构:

shiro + Ehcache

业务需求:在此基础上搭建负载均衡,解决session共享问题。

尝试1:

nginx配置ip_hash,ip_hash技术能够在一定时间里将某个ip 的请求定向到同一台后端服务中,这样一来这个ip 下的客户端和某个后端就能建立起稳固的session.

 

尝试2:

Session数据缓存在Ehcache中:

1) ehcache配置文件中配置:
<!-- 监听服务,用户监听其它应用通过过来的session操作 --><cacheManagerPeerListenerFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"properties="hostName=localhost, port=40002,socketTimeoutMillis=2000"></cacheManagerPeerListenerFactory><!-- 提供服务,当本应用对session操作时,会复制到其它应用(如果是多个应用则需要在rmiUrls属性写多个url,并用中竖线分割 --><cacheManagerPeerProviderFactoryclass="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"properties="peerDiscovery=manual,rmiUrls=//localhost:40001/shiro-activeSessionCache"></cacheManagerPeerProviderFactory>
2)配置CacheManager/*** 核心:SecurityManager,权限管理,这个类组合了登陆,登出,权限,session的处理,是个比较重要的类。* 依赖项设置:Realm,SessionManager,CacheManager*/@Bean(name = "securityManager")public DefaultWebSecurityManager defaultWebSecurityManager(SystemAuthorizingRealm systemAuthorizingRealm,DefaultWebSessionManager sessionManager, EhCacheManager examCacheManager) {DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();defaultWebSecurityManager.setRealm(systemAuthorizingRealm);defaultWebSecurityManager.setSessionManager(sessionManager);EhCacheManager ehCacheManager = new EhCacheManager();ehCacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");defaultWebSecurityManager.setCacheManager(examCacheManager);return defaultWebSecurityManager;}
3)配置SessionDAO@Bean(name = "sessionDao")public EnterpriseCacheSessionDAO sessionDao(){EnterpriseCacheSessionDAO sessionDao = new EnterpriseCacheSessionDAO();sessionDao.setActiveSessionsCacheName("shiro-activeSessionCache");return sessionDao;}

尝试3:

redis集中管理session

网上随便一搜出现很多使用spring Session + redis来解决session共享问题的例子

具体操作非常简单:

1 引入以下jar包<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>2 配置文件spring.session.store-type=redis
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.timeout=30003 开启注解
@EnableRedisHttpSession

可惜我试了没有效果,如果你们试了有效果,还请留言告知

  相关解决方案