我是靠谱客的博主 畅快白开水,最近开发中收集的这篇文章主要介绍解决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

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

最后

以上就是畅快白开水为你收集整理的解决session共享问题的全部内容,希望文章能够帮你解决解决session共享问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部