用ajax请求,在后台重定向失败

问题

今天发现,当使用Ajax请求时,如果后台进行重定向到其他页面时是无法成功的,只能在浏览器地址栏输入才能够实现重定向。

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

需要实现的功能是,后台网关拦截请求,看请求中是否存在token.如果不存在就跳转到登录页面。因为大多数请求都是使用Ajax.一开始发现无法进行重定向,每次都是返回到Ajax的结果处理函数。最终的解决办法如下,需要后台和前端进行处理。

解决方法

后台:

/**
 *功能描述
 * @author lgj
 * @Description  重定向工具类
 * @date 2/27/19
*/
@Slf4j
public class RedirecUtil {

    /**
     *功能描述
     * @author lgj
     * @Description  重定向
     * @date 2/27/19
     * @param:
     * @return:
     *
    */
    public  static void  redirect(RequestContext ctx, String redirectUrl){

        try{
            //如果是Ajax请求
            if("XMLHttpRequest".equals(ctx.getRequest().getHeader("X-Requested-With"))){
                log.debug("ajax redirect");
                sendRedirect(ctx.getResponse(),redirectUrl);
            }
            //如果是浏览器地址栏请求
            else {

                log.debug("normal redirect ");
                ctx.getResponse().sendRedirect(redirectUrl);
            }
        }
        catch(Exception ex){
            ex.printStackTrace();
        }

    }


    /**
     *功能描述 
     * @author lgj
     * @Description   Ajax请求时重定向处理
     * @date 2/27/19
     * @param: 
     * @return: 
     *
    */
    private static void sendRedirect(HttpServletResponse response, String redirectUrl){
        try {
       //这里并不是设置跳转页面,而是将重定向的地址发给前端,让前端执行重定向
            //设置跳转地址
            response.setHeader("redirectUrl", redirectUrl);
            //设置跳转使能
            response.setHeader("enableRedirect","true");
            response.flushBuffer();
        } catch (IOException ex) {
            log.error("Could not redirect to: " + redirectUrl, ex);
        }
    }
}

前端处理
第一种方式:使用Ajax的complete方法

$.ajax({
            type: "post",
            url: "/auth/token/check",
            success: function(data,status){
                console.log("/token/check 返回 status : "+status)


            },
            //请求完成调用
           (XHR, TS){
                console.log("complete");
                var url = XHR.getResponseHeader("redirectUrl");
                console.log("redirectUrl = " + url);

                var enable = XHR.getResponseHeader("enaleRedirect");
                console.log("enableRedirect = " + enable);
                if((enable == "true") && (url != "")){ 

                    var win = window; 
  
              while(win != win.top){
               win = win.top;
              }
              win.location.href = url; 
          }  
      },  
    });
 })

但是上面有个问题就是,每个ajax都需要编写 comlete 方法,代码复用率低。

第二种方法 : 使用全局的complete方法

ajax请求:

 $("#NON-TOKEN").click(function () {
        $.ajax({
           type: "post",
            url: "/auth/token/check",
           success: function(data,status){
               console.log("/token/check 返回 status : "+status)


            },
    
        });

全局处理
注意这参数(event, xhr, settings)不能少,否则会报错

//每一个Ajax 请求完成之后都会执行。
$(document).ajaxComplete(function (event, xhr, settings) {
        console.log("ajaxComplete  ")
        redirectHandle(xhr);
    })
 function  redirectHandle(xhr) {

  //获取后台返回的参数
   var url = xhr.getResponseHeader("redirectUrl");
   console.log("redirectUrl = " + url);
   var enable = xhr.getResponseHeader("enableRedirect");

   if((enable == "true") && (url != "")){
       var win = window;
       while(win != win.top){
           win = win.top;
       }
       win.location.href = url;
   }
}

转自

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值