AJAX无法重定向解决方法

一. 原因

ajax 是默认就是不支持重定向的,它是局部刷新,不重新加载页面。

二. 解决办法

我的解决办法就是从前后端都做处理,项目中遇到重定向大多出现在拦截器或者过滤器中。在项目中我使用spring的拦截器去拦截所有的action请求,判断当前用户有无登录,若没有登录就重定向到登录页面。

1. 后端处理的代码

    public class MyInterceptor extends HandlerInterceptorAdapter{
        //该方法是进入controller的必经之路。
        @Override
        public boolean preHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler) throws Exception {
            if(是否登录了?){
                return true; 
            }else { //没有登录重定向到登录页面
                reDirect(request, response); 
                return false;
            }
        }

        @Override
        public void postHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            // TODO Auto-generated method stub
            super.postHandle(request, response, handler, modelAndView);
        }

        @Override
        public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            // TODO Auto-generated method stub
            super.afterCompletion(request, response, handler, ex);
        }

        //对于请求是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");
            }
        }

    }
  • 说明一下请求路径的获取:

(1). request.getScheme() 返回当前链接使用的协议;比如,一般应用返回http;SSL返回https;
(2). request.getServerName() 获取网站的域名,如果是在本地的话就是localhost
(3). request.getServerPort() 获取的服务器的请求端口

(4). request.getContextPath()获取当前的系统路径

2. 前段处理的代码

(1). 下面的代码请放在全局的js中 (用于初始化ajax请求,让它结束之后运行completer后面的函数)

    var jqxhr;
    //设置ajax请求完成后运行的函数,
    $.ajaxSetup({ 
        complete:function(){
            if("REDIRECT" == jqxhr.getResponseHeader("REDIRECT")){ //若HEADER中含有REDIRECT说明后端想重定向,
                var win = window;
                while(win != win.top){
                    win = win.top;
                }
                win.location.href = jqxhr.getResponseHeader("CONTENTPATH");//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
            }
        }
    });
  •  

$.ajaxSetup()方法的详解请点击该链接

(2). 只要有ajax请求就让它的返回值为jqxhr

比如:jqxhr = $.post(url, requestData, function(result){})

猜你喜欢

转载自blog.csdn.net/qq_35232663/article/details/81986474
今日推荐