前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于重定向的坑

关于重定向的坑

作者头像
用户3258338
发布2019-07-19 17:08:04
5150
发布2019-07-19 17:08:04
举报

放弃垃圾快乐!

最近两天,北京的风很大,所以天很蓝,珍惜这个五月吧,马上要热起来了。

上一周简直忙到起飞,回想一下,其实也并不是活很多,还是效率不够高啊,嗯哼,需要好好想想怎么提高效率了!

最近做了一件之前没有做过的东西,就是要监听接口307,然后根据这个307去做一些事情。之前的代码,是用jq写的,封装了请求方法。

使用的是:

代码语言:javascript
复制
jQuery.ajax( url [, settings ] )

然后我就想要在回调方法里面去监听307。

我开始想使用方法:

代码语言:javascript
复制
$.ajax({
  statusCode: {
    307: function() {
      alert("redirect");
    }
  }
});

然而,根本不会走到这个回调里面去。又换了一种方法:

代码语言:javascript
复制
ajax({
  error: function(xhr){
    if(xhr.status==307){
      console.log("307")
    }
  }
});

然而,也不会走到这个回调里面去。这个时候我就懵了。不知道了,不会了。

我就开始在网上搜,发现好多同学出现这种情况。网上说,我们根本抓不到307,只能通过重定向之后的那次请求结果来做一些自己想做的事情。具体的方法是在重定向之后的那次请求里面添加一个自定义response header,然后通过识别这个头,来做想做的。

虽然好多网友都这么说了,但是我并不能找到正经的文档来说服自己相信这些。

然后我就实验:我用原生的js去发送ajax请求,去监听。

代码语言:javascript
复制
ajaxFun(){
        var client = new XMLHttpRequest();
        client.open("GET", "/abc", true);
        client.send();
        client.onreadystatechange = function() {
          console.log("this",this);

          if(this.readyState == 2) {
            console.log("this.readyState == 2 this===>",this);
            var resheader = this.getAllResponseHeaders();
            console.log("resheader",resheader);
          }
          if(this.readyState == 4) {
            console.log("-----")
           // 获取请求头
            var type = this.getResponseHeader('Content-type'); 
            var locationA = this.getResponseHeader('Loaction');
            var locationB = this.getResponseHeader('loaction');
            var MyselfHeader = this.getResponseHeader('MyselfHeader');
            // 
            console.log("locationA",locationA);
            console.log("locationB",locationB);
            console.log("type",type);
            console.log("MyselfHeader",MyselfHeader);
          }
        }
      }

当readyState==4的时候,查看这个请求,发现已经是被重定向之后的请求了,是不是我监听的晚了呢?

我又在readyState==2的时候,查看这个请求,发现还是重定向之后的请求。

和一位老朋友请教这个问题,他给我了一些帮助,他直接把规范发给我了。

https://xhr.spec.whatwg.org/#states 。

重点看readyState ==2 时的解释:All redirects (if any) have been followed and all HTTP headers of the response have been received.(所有的重定向已经被followed了)所以,有了规范的说明,才有底气去做。

所以现在知道了吧?浏览器会自发的对返回307的接口进行重定向,前端这边拿不到这个307的状态的,所以如果想通过307来做什么的时候,可以将重定向之后的api返回一个约定的header,根据header去识别操作。

愿我们有能力不向生活缴械投降---Lin

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 女程序员的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档