概述
项目原结构:
shiro + Ehcache
业务需求:在此基础上搭建负载均衡,解决session共享问题。
尝试1:
nginx配置ip_hash,ip_hash技术能够在一定时间里将某个ip 的请求定向到同一台后端服务中,这样一来这个ip 下的客户端和某个后端就能建立起稳固的session.
尝试2:
Session数据缓存在Ehcache中:
1) ehcache配置文件中配置:
<!-- 监听服务,用户监听其它应用通过过来的session操作 -->
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=localhost, port=40002,
socketTimeoutMillis=2000">
</cacheManagerPeerListenerFactory>
<!-- 提供服务,当本应用对session操作时,会复制到其它应用(如果是多个应用则需要在rmiUrls属性写多个url,并用中竖线分割 -->
<cacheManagerPeerProviderFactory
class="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=3000
3 开启注解
@EnableRedisHttpSession
可惜我试了没有效果,如果你们试了有效果,还请留言告知
最后
以上就是畅快白开水为你收集整理的解决session共享问题的全部内容,希望文章能够帮你解决解决session共享问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复