解决session退出、失效后前端ajax请求被shiro拦截器拦截未能跳转重定向到登录页面问题
·
解决session退出、失效后前端ajax请求被shiro拦截器拦截未能跳转重定向到登录页面问题
public class MyFormAuthenticationFilter extends FormAuthenticationFilter {
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
//获取当前请求的路径
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+httpServletRequest.getContextPath();
//如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求,需要特殊处理 否则直接重定向就可以了
if("XMLHttpRequest".equals(httpServletRequest.getHeader("X-Requested-With"))){
httpServletResponse.setHeader("REDIRECT", "REDIRECT");//自定义表头
httpServletResponse.setHeader("CONTEXTPATH", basePath+"/login");//重定向的路径
httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);//403
}else{
httpServletResponse.sendRedirect(basePath + "/login");
}
return false;
}
}
##在ShiroConfig类中的shiroFilter添加以上自定义的内容
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
LinkedHashMap<String, Filter> map = new LinkedHashMap<>();
map.put("authc",new MyFormAuthenticationFilter());
shiroFilterFactoryBean.setFilters(map);
return shiroFilterFactoryBean;
}
##在前端js自定义一个全局的ajaxSetup方法
$.ajaxSetup({
complete:function(XMLHttpRequest,textStatus){
var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");
var url= XMLHttpRequest.getResponseHeader("CONTEXTPATH");
if(redirect == "REDIRECT"){
window.location.href=url;
}
}
});
更多推荐
所有评论(0)