解决session共享问题

项目原结构:

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

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

发布了73 篇原创文章 · 获赞 44 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_34928194/article/details/98942161
今日推荐