当前位置:   article > 正文

ajax请求拦截器无法跳转页面问题_每次加上拦截器就无法进入页面

每次加上拦截器就无法进入页面

ajax请求拦截器无法跳转页面问题

今天在写项目的第一个登入功能的时候,按照以往对拦截器的操作进行实现,最终请求返回200,但是页面怎么也无法跳转。重新复习了一遍拦截器之后发现操作并没有问题。
后来通过度娘发现,前端用ajax请求的时候,后端通过拦截器是无法让页面进行跳转的,具体原因还没有搞懂。
跟着度娘在拦截器中加入以下代码后发现页面终于可以跳转了。
(功能:如果没有登入过则跳转到登入页面进行登入)

拦截器的实现
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器执行了");
        HttpSession session = request.getSession();
        //获取当前请求的路径
        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("CONTEXTPATH", basePath+"/templates/login.jsp");
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        }else{
            response.sendRedirect(basePath + "/templates/login.jsp");
        }
        return false;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

前端代码添加

$.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");
                }
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这段代码的含义,大抵就是,在 ajax请求完成以后,执行 complete 回调方法,里面进行一些逻辑的判断;
如果响应头中包含 REDIRECT 则说明是拦截器返回的,则进行跳转,CONTEXTPATH 的值,由后台定义;

总结

如果前端通过ajax发送请求,后端拦截器需要对页面进行跳转的话,需要通知ajax。在返回的响应头中需要写入相应的数据,前端获得数据后需要进行判断才能进行跳转。

代码应该差不多就是这样,但是具体原理还并不了解。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/652418
推荐阅读
相关标签
  

闽ICP备14008679号