最近遇到shiro校驗框架成功後不進行自動跳轉到指定頁面;html
相關配置以下:java
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="loginUrl" value="/login" /> <property name="successUrl" value="/account/user/current" /> <property name="filterChainDefinitions"> <value> /login = authc /test = authc /logout = logout /static/** = anon /** = authc </value> </property> </bean>
我使用的是驗證過濾器是authc;邏輯上只要登陸成功便可跳轉至「/account/user/current」實際上不行;web
主要緣由是successUrl配置只是作爲一種附加配置,只有session中沒有用戶請求地址時纔會使用successUrl;spring
系統默認登陸成功後首次跳轉的地址爲,訪問系統時初次使用地址,例:若是用戶首次訪問的是http://****/aa/aa.html; apache
那麼shiro校驗成功後跳轉的地址便可http://****/aa/aa.html; 不然shiro將跳轉到默認虛擬路徑:「/」;session
對於應用中,若是沒有註冊/路徑,則默認使用web.xml中配置的<welcom-list>配置;框架
shiro源碼邏輯以下:spa
String successUrl = null;
boolean contextRelative = true;
SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(request);
if (savedRequest != null && savedRequest.getMethod().equalsIgnoreCase(AccessControlFilter.GET_METHOD)) {
successUrl = savedRequest.getRequestUrl();
contextRelative = false;
}
if (successUrl == null) {
successUrl = fallbackUrl;
}
if (successUrl == null) {
throw new IllegalStateException("Success URL not available via saved request or via the " +
"successUrlFallback method parameter. One of these must be non-null for " +
"issueSuccessRedirect() to work.");
}
WebUtils.issueRedirect(request, response, successUrl, null, contextRelative);
上述代碼紅色部分代表,對於成功後地址指向,會依據會話SESSION中保留的請求地址;code