解决 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问题。
正文到此结束
- 本文标签: redis shiro Spring Boot
- 版权声明: 本站原创文章,于2019年07月03日由廉月程发布,转载请注明出处