原创

解决 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问题。

正文到此结束
本文目录