剛開始使用shiro,發(fā)現(xiàn)明明配置的successURL是”/admin/index”,但是最后卻跳轉(zhuǎn)到各種奇怪的鏈接,xx.js,xxx.min.css這類。
我的shiro配置如下:

配置相關(guān)截圖.png
然后追蹤代碼,發(fā)現(xiàn)登錄成功后執(zhí)行FormAuthenticationFilter的onLoginSuccess方法:
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject,
ServletRequest request, ServletResponse response) throws Exception {
issueSuccessRedirect(request, response);
//we handled the success redirect directly, prevent the chain from continuing:
return false;
}
其中調(diào)用的這個方法:
protected void issueSuccessRedirect(ServletRequest request, ServletResponse response) throws Exception {
WebUtils.redirectToSavedRequest(request, response, getSuccessUrl());
}
public static void redirectToSavedRequest(ServletRequest request, ServletResponse response, String fallbackUrl)
throws IOException {
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);
}
successUrl = savedRequest.getRequestUrl();這里會跳轉(zhuǎn)到初次系統(tǒng)訪問的地址。比如用戶初次訪問的是a1/first.html,登錄之后將會跳轉(zhuǎn)到該地址。如果沒有初次訪問的地址,就會訪問”/”。
我解決方法是重寫FormAuthenticationFilter的onLoginSuccess方法:
我用的是springboot,以配置類的形式配置的。
首先重寫:
publicclassMyFormAuthenticationFilter extendsFormAuthenticationFilter{
@Override
protectedbooleanonLoginSuccess(AuthenticationToken token, Subject subject,
ServletRequest request, ServletResponse response) throwsException {
String successUrl = "/admin/access/index.html";//我是直接寫死了跳轉(zhuǎn)鏈接
WebUtils.issueRedirect(request,response,successUrl);
returnfalse;//返回false表示執(zhí)行鏈結(jié)束
}
}
然后在shiroFilter配置類中加入該filter:
//解決shiro 登錄成功后無法正確跳轉(zhuǎn)successUrl的問題,重寫Filter
Map map = newLinkedHashMap();
map.put("authc",newMyFormAuthenticationFilter());
shiroFilterFactoryBean.setFilters(map);

TIM圖片20180307144056.png
如果是spring 項目,直接在xml文件做響應(yīng)配置即可。