zoukankan      html  css  js  c++  java
  • 拦截器拦截的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");
            }
        } );
  • 相关阅读:
    【CH 5501】环路运输【DP】【单调队列】
    【CH 5501】环路运输【DP】【单调队列】
    【POJ 1456】Supermarket【并查集】
    【POJ 1456】Supermarket【并查集】
    【POJ 1456】Supermarket【并查集】
    【POJ 2411】Mondriaan's Dream【DP】
    数据结构实验之二叉树二:遍历二叉树
    数据结构实验之二叉树二:遍历二叉树
    36 静态数据成员与静态成员函数
    36 静态数据成员与静态成员函数
  • 原文地址:https://www.cnblogs.com/songyaru/p/14962027.html
Copyright © 2011-2022 走看看