調試shiro 處理登陸後頁面跳轉問題時,頁面總是無法跳轉到之前訪問的頁面去,查看配置,沒有問題。
經查看 登陸前已經保存了請求,但是登陸後獲取卻爲空,經查看登陸前後的sessionid 不一致。
shiro 配置如下:
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="frontsystemAuthorizingRealm" />
<property name="cacheManager" ref="shiroCacheManager" />
</bean>
每次請求sessionid應該一致,但是卻發現每次訪問sessionid都不一樣,一個瀏覽器一個窗口的情況
最後發現,原來代碼中多做了用戶退出操作。
雖然刪了多餘的用戶退出,還是無法記錄之前訪問的頁面,最後發現以下shiro 源碼:
public static SavedRequest getAndClearSavedRequest(ServletRequest request) {SavedRequest savedRequest = getSavedRequest(request);
if (savedRequest != null) {
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession();
session.removeAttribute(SAVED_REQUEST_KEY);
}
return savedRequest;
該方法在一次請求中不能重複調用。
另外:使用org.apache.shiro.web.session.mgt.DefaultWebSessionManager
卻出現sessionid 不存在異常
經查看是 freemarker 訪問標籤時調用的session 不存在導致,初步解釋,freemarker 和DefaultWebSessionManager 存在兼容性問題