shiro分布式session読み取りredis回数が多すぎるという問題を解決する
2205 ワード
DefaultWebSessionManagerの
xmlファイルを変更し、実際の状況に応じて変更することを忘れないでください.
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ファイルを変更し、実際の状況に応じて変更することを忘れないでください.