解决 springboot整合shiro,redis缓存session 多次从redis获取session问题

    spring boot整合shiro redis缓存session的教程很多,我这里就不多说了,看了好多教程没有解决缓存session 多次从redis获取session的问题,所以发表此博客,希望对大家有所帮助。本人也是小白一个,如果有什么问题还请各位大神多多指教!

     其实我们在自定义RedisSessionDao的时候 重写了doReadSession方法 读取session,我们可以往里面跟一下看看 其实调用的是SessionManager的retrieveSession方法。好了,看到这我们就有大概思路了,我们可以自定义SessionManager,重新retrieveSession方法,把session放到request里面,这样就不用每次去redis里面去取了,这样大大提高了redis的性能。

    思路有了,咱们一起来看代码吧!

import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.SessionKey;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.session.mgt.WebSessionKey;
import javax.servlet.ServletRequest;
import java.io.Serializable;

/**
 * @Auther: lianyc
 * @Date: 2018/8/14 15:04
 * @Description:
 */
public class ShiroSessionManager extends DefaultWebSessionManager {

	public ShiroSessionManager(){
		super();
	}


	//重写这个方法为了减少多次从redis中读取session(自定义redisSessionDao中的doReadSession方法)
	protected Session retrieveSession(SessionKey sessionKey){
		Serializable sessionId = getSessionId(sessionKey);
		ServletRequest request = null;
		if(sessionKey instanceof WebSessionKey){
			request = ((WebSessionKey)sessionKey).getServletRequest();
		}
		if(request != null && sessionId != null){
			Session session =  (Session) request.getAttribute(sessionId.toString());
			if(session != null){
				return session;
			}
		}
		Session session = super.retrieveSession(sessionKey);
		if(request != null && sessionId != null){
			request.setAttribute(sessionId.toString(),session);
		}
		return session;
	}
}

最后把自定义sessionManager注入到SecurityManager中

@Bean(name="securityManager")
public DefaultWebSecurityManager securityManager() {  
    DefaultWebSecurityManager manager = new DefaultWebSecurityManager();  
    //自定义session管理
    manager.setSessionManager(sessionManager());
    return manager;  
}

好了,这样就解决了多次从redis获取session问题。

Shiro-Redis 是一个用于在 Shiro 中实现 Session 共享的插件,它使用 Redis 作为数据存储和缓存,以实现分布式环境下的 Session 共享。 要实现 Shiro-RedisSession 共享,你需要进行以下步骤: 1. 引入 Shiro-Redis 插件依赖:在项目的 Maven 或 Gradle 配置文件中添加 Shiro-Redis 依赖。 2. 配置 Redis 连接信息:在项目的配置文件中配置 Redis 的连接信息,包括主机名、端口号、密码等。 3. 配置 RedisSessionDAO:在 Shiro 的配置文件中配置 RedisSessionDAO,指定使用 Redis 作为 Session 存储和缓存的实现。可以设置过期时间、前缀等参数。 4. 配置 Session Manager:在 Shiro 的配置文件中配置 Session Manager,指定使用自定义的 RedisSessionManager 作为 Session 的管理器。同时,需要将之前配置的 RedisSessionDAO 设置给 RedisSessionManager。 5. 配置 SecurityManager:在 Shiro 的配置文件中配置 SecurityManager,指定使用自定义的 RedisSessionManager 作为 Session 管理器。同时,需要将之前配置的 RedisSessionDAO 设置给 RedisSessionManager。 6. 配置 Filter Chain:在 Shiro 的配置文件中配置 Filter Chain,将自定义的 RedisSessionManager 添加到 Filter Chain 中,以便对请求进行 Session 管理。 通过以上步骤配置完成后,Shiro 将会使用 Redis 进行 Session 的存储和缓存,从而实现 Session 的共享。在分布式环境中,不同应用节点之间可以通过 Redis 共享 Session 数据,从而实现用户的登录状态和会话信息的共享。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值