拦截器拦截的ajax请求无法重定向到登录页面

1、处理ajax请求重定向需要结合前端代码ajax方法进行处理。

2、后端处理:给请求头塞参数

其中重要的两个参数:REDIRECT、CONTEXTPATH

1)添加重定向标识:“REDIRECT”,告诉ajax我是重定向:response.setHeader("REDIRECT", "REDIRECT");
2)添加请求路径:“CONTEXTPATH”,告诉ajax重定向路径:response.setHeader("CONTEXTPATH", "跳转路径");
3)将自定义请求头REDIRECT、CONTEXTPATH暴露给外部:response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTEXTPATH");
4)后端代码示例如下:

//对于请求是ajax请求重定向问题的处理方法
public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取当前请求的路径
        //logger.error("请求类型:"+request.getHeader("X-Requested-With"));
        response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTEXTPATH");
        //告诉ajax我是重定向
        response.setHeader("REDIRECT", "REDIRECT");
        //告诉ajax我重定向的路径
        String url = "https://xxx.xxx.xxx/";//重定向路径
        response.setHeader("CONTEXTPATH", url);
        response.getWriter().write(1);
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
 
    }
// 在业务处理器处理请求之前被调用
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
        ......校验未登录
        if(未登录){
        redirect(request,response);//调用重定向问题处理方法
        return false;
    }else{
         return true;//请求放行
    }
       
}
 //判断请求是不是ajax请求
String requestType = request.getHeader("X-Requested-With");
if("XMLHttpRequest".equals(requestType)){
    System.out.println("AJAX请求..");
}else{
    System.out.println("非AJAX请求..");
    //此时requestType为null
}

3、前端代码处理:ajax请求,自然是在ajax方法中做处理。后端传了参数的参数就是为了让前端来接收。

前端处理步骤如下:

1)在ajax方法中添加“complete ”,complete 在ajax中无论ajax请求成功或失败都会执行。

2) 在complete 中获取响应头中的参数 REDIRECT ,该参数是我们在拦截器拦截成功后塞进去,用来标识该请求是重定向请求的。

3) 获取请求路径,并跳转至重定向页面

4)前端代码示例如下:

$.ajax({
                url : "......",
                type : "post",
                data : {
                    ......
                },
                success : function(text) {
                    ......
                        },
                error : function(e, f, g) {
                    ......
                },
                complete : function(xhr, status) {
                    alert(status)
                    //拦截器实现超时跳转到登录页面
                    // 通过xhr取得响应头
                    var REDIRECT = xhr.getResponseHeader("REDIRECT");
                    //如果响应头中包含 REDIRECT 则说明是拦截器返回的需要重定向的请求
                    if (REDIRECT == "REDIRECT")
                    {
                        var win = window;
                        while (win != win.top)
                        {
                            win = win.top;
                        }                   
                        win.location.href = xhr.getResponseHeader("CONTEXTPATH");
                    }
                }
            });

或者加一个ajax全局处理函数:

 $(document).ajaxComplete( function(event, jqXHR, options){
        //拦截器实现超时跳转到登录页面
        // 通过xhr取得响应头
        var REDIRECT = jqXHR.getResponseHeader("REDIRECT");
        //如果响应头中包含 REDIRECT 则说明是拦截器返回的需要重定向的请求
        if (REDIRECT == "REDIRECT")
        {
            var win = window;
            while (win != win.top)
            {
                win = win.top;
            }
            win.location.href = jqXHR.getResponseHeader("CONTEXTPATH");
        }
    } );

 

posted @ 2021-07-02 09:58  梦想在风中飘扬  阅读(946)  评论(0编辑  收藏  举报