解决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;
        }
    }
});
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐