哎, 由于剛畢業(yè)想做一個(gè)項(xiàng)目, 用到了 Shiro 來做權(quán)限管理, 可是萬萬沒想到剛開始做就出了問題, 原因是因?yàn)榈卿浀臅r(shí)候使用 ajax 進(jìn)行請(qǐng)求的.
登錄成功后卻一直無法進(jìn)行頁面跳轉(zhuǎn)如下圖:
可以看到 我們將數(shù)據(jù)提交到
login.do
登錄成功了后會(huì)重定向到index.jsp
頁面, 但是瀏覽器卻還是停留在 登錄界面.這點(diǎn)讓我感覺操蛋!!!
但是我們看請(qǐng)求發(fā)現(xiàn):
返回一個(gè)302錯(cuò)誤, 額 我們不管這個(gè)狀態(tài)碼是啥, 我們說說怎么處理.
首先我們確定這個(gè)請(qǐng)求是 ajax 的, 而且之間的數(shù)據(jù)傳遞是 json , 那么我們也需要返回 json 是不是才算完成了一個(gè)完整的請(qǐng)求/響應(yīng).我們添加如下代碼
public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {
@Override
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = WebUtils.toHttp(request);
HttpServletResponse httpServletResponse = WebUtils.toHttp(response);
if (!"XMLHttpRequest".equalsIgnoreCase(httpServletRequest.getHeader("X-Requested-With"))) {// 不是ajax請(qǐng)求
return super.onLoginSuccess(token, subject, request, response);
} else {
httpServletResponse.setCharacterEncoding("UTF-8");
PrintWriter out = httpServletResponse.getWriter();
out.println("{\"resultInfo\":\"s\"}");
out.flush();
out.close();
}
return false;
}
}