$.ajax 请求 拦截器 重定向 无效 解决办法

在ajax 异步请求下 拦截器过滤器中使用 重定向 页面响应无效

我这里用的是springboot框架,用拦截器实现 对请求的拦截 ,session超时直接跳转到login.html页面。

后台代码:

@Override
    public void addInterceptors(InterceptorRegistry registry)
    {
    //加载自定义拦截器(登录请求和退出请求放行)
        registry.addInterceptor(new DemoIntercept()).addPathPatterns("/**").excludePathPatterns("/loginController","/logout");
    }


/**
*自定义拦截器
**/
public class DemoIntercept implements HandlerInterceptor
{

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
            throws Exception
    {
        logger.info("afterCompletion:{}", request.getRequestURI());
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
            throws Exception
    {
        logger.info("postHandle:{}", request.getRequestURI());
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception
    {
        //获取session
        HttpSession session = request.getSession();
        Object username = session.getAttribute("username");
        //用户如果为null 则 重定向到 login页面 ,否则放行
        if(null == username)
        {
            //重定向到login.html
             redirect(request, response); 
             return false;
        }
        return true;
    }


      //对于请求是ajax请求重定向问题的处理方法
    public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //获取当前请求的路径
        String basePath = request.getScheme() + "://" + request.getServerName() + ":"  + request.getServerPort()+request.getContextPath();
        //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求,需要特殊处理 否则直接重定向就可以了
        if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
            //告诉ajax我是重定向
            response.setHeader("REDIRECT", "REDIRECT");
            //告诉ajax我重定向的路径
            response.setHeader("CONTENTPATH", basePath+"/login.html");
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        }else{
            response.sendRedirect(basePath + "/login.html");
        }
    }
}

前台代码

//这里给所有ajax请求添加一个complete函数
$.ajaxSetup({
            complete : function(xhr, status) {
                //拦截器实现超时跳转到登录页面
                // 通过xhr取得响应头
                var REDIRECT = xhr.getResponseHeader("REDIRECT");
                //如果响应头中包含 REDIRECT 则说明是拦截器返回的
                if (REDIRECT == "REDIRECT")
                {
                    var win = window;
                    while (win != win.top)
                    {
                        win = win.top;
                    }
                    //重新跳转到 login.html 
                    win.location.href = xhr.getResponseHeader("CONTEXTPATH");
                }
            }
        });

这里实现的原理也就是,后台在ajax请求头上打上标记 (REDIRECT ),标记(REDIRECT )这个请求要重定向,而前台接受到响应后 根据标记(REDIRECT )判断这个响应头是否需要 重定向 如果需要则 则获取重定向地址 就可以了

原文地址:https://www.cnblogs.com/jpfss/p/9547977.html