解決 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問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章