在shiro的登录中,当用户登录成功,shiro会自动处理跳转回登录前的页面,因此在后端中不需要处理shiro登录成功后的操作
但是,如果使用ajax登录的话,则无法自动跳转,此时就需要后端给前端返回此前的跳转url,否则ajax不知道登录成功后的操作
实现 FormAuthenticationFilter的onLoginSuccess方法,判断是否通过ajax登录,如果不是则继续由shiro操作,如果不是则返回callbackurl
public class MyFormAuthenticationFilter extends FormAuthenticationFilter {
/*
* 返回跳转到登录前的页面
*/
@Override
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
ServletResponse response) throws Exception {
// TODO Auto-generated method stub
ActiveUser activeUser = (ActiveUser) subject.getPrincipal();
HttpServletRequest request2 = (HttpServletRequest) request;
HttpServletResponse response2 = (HttpServletResponse) response;
HttpSession session = request2.getSession();
// 把user放到session中
session.setAttribute("user", activeUser);
try {
System.err.println("callbackUrl : " + WebUtils.getSavedRequest(request).getRequestURI());// 上个请求的请求url
if (!"XMLHttpRequest".equalsIgnoreCase(
request2.getHeader("X-Requested-With"))) {
// 不是ajax请求
issueSuccessRedirect(request, response); // 跳转回去
} else { // ajax請求直接返回callbackUrl
response2.setCharacterEncoding("UTF-8");
PrintWriter out = response2.getWriter();
out.print(WebUtils.getSavedRequest(request).getRequestURI());
out.flush();
out.close();
}
} catch(Exception exception) {
exception.printStackTrace();
}
// 若运行到这里,说明是ajax请求,所以直接return false
return false;
}
}