shiro分布式session読み取りredis回数が多すぎるという問題を解決する

2205 ワード

DefaultWebSessionManagerのretrieveSession()メソッドを書き換えます.Webの下でshiroを使用する場合、このsessionKeyはWebSessionKeyタイプで、このクラスにはservletRequestというよく知られている属性があります.直接セッション相手をrequestに突っ込む!では、単一のリクエストサイクルでrequestからsessionを取り出すことができ、リクエストが終了するとrequestが破棄され、役割ドメインとライフサイクルの問題が考慮されます.OverrideというretrieveSessionメソッドが必要であることは明らかです.そのため、以下のようにカスタムSessionManagerを使用する必要があります.

import java.io.Serializable;

import javax.servlet.ServletRequest;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.SessionKey;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.session.mgt.WebSessionKey;

public class ShiroSessionManager extends DefaultWebSessionManager {
	/**
	 *   session             redis   
	 * @param sessionKey
	 * @return
	 * @throws UnknownSessionException
	 */
	@Override
	protected Session retrieveSession(SessionKey sessionKey) throws UnknownSessionException {
		Serializable sessionId = getSessionId(sessionKey);

		ServletRequest request = null;
		if (sessionKey instanceof WebSessionKey) {
			request = ((WebSessionKey) sessionKey).getServletRequest();
		}

		if (request != null && null != sessionId) {
			Object sessionObj = request.getAttribute(sessionId.toString());
			if (sessionObj != null) {
				return (Session) sessionObj;
			}
		}

		Session session = super.retrieveSession(sessionKey);
		if (request != null && null != sessionId) {
			request.setAttribute(sessionId.toString(), session);
		}
		return session;
	}
}

xmlファイルを変更し、実際の状況に応じて変更することを忘れないでください.