首页 > 其他分享 >不能显式拦截ajax请求的302响应?

不能显式拦截ajax请求的302响应?

时间:2023-10-01 18:22:40浏览次数:57  
标签:status axios 302 响应 ajax 显式 resp

记录工作中早该加深印象的一个小case: ajax请求不能显式拦截 302响应。

我们先来看一个常规的登录case:

  1. 浏览器请求资源,服务器发现该请求未携带相关凭据(cookie或者token)
  2. 服务器响应302,并在响应头Location写入重定向地址, 指示浏览器跳转到登录页
  3. 浏览器跳转到登录页,提交身份信息,回调到原业务站点,服务端利用Set-Cookie响应头种下cookie或者token

利用axios库发起请求

Axios is a promise-based HTTP Client for node.js and the browser. It is isomorphic (= it can run in the browser and nodejs with the same codebase). On the server-side it uses the native node.js http module, while on the client (browser) it uses XMLHttpRequests.

When you make an HTTP request with axios, the library returns a promise. If the request is successful (i.e. the server responds with a 2xx status code), the promise will be resolved and the then() callback will be called with the response data. On the other hand, if the request fails (i.e. the server responds with a 4xx or 5xx status code), the promise will be rejected and the catch() callback will be called with the error.

  1. axios在浏览器发起的是ajax请求
  2. axios默认认为2xx状态码是成功的响应, 会进入promise的resolved回调函数, 本case第一次会收到302重定向响应, 故添加ValidateStatus配置

伪代码如下:

   axios.request({
       method:'get',
       url:'/login',
       validateStatus: function (status) {
                return status >= 200 && status < 300 || status === 302; 
       },
   }).then((resp)=> {
     if resp.status ===302 {
         window.location.href = resp.headers['Location']
      }else{
        var userInfo = JSON.parse(
                    decodeURIComponent(
                        resp.data.msg || ""
                    ) || "{}"
                )
        this.setState({
              userInfo
        })
     }
   })

实际上以上ajax请求收到的302响应并不能被显式拦截,上面的resp实际是redirect之后的页面的响应体

核心在于:所有浏览器都遵循了ajax标准readystatus=2, All redirects (if any) have been followed and all headers of a response have been received.

翻译下来就是 : ajax收到的响应如果有重定向,必然是重定向逻辑走完之后的响应。


对于这个常规的case, github上给出的思路是: 针对不同类型的http请求,服务端给出不同的状态码。

  if  req.isXhr {
     c.JSON(http.StatusForbidden, gin.H{
          "code": 403,
          "msg":  redirectUrl}) 
  }else {
      c.Redirect(http.StatusFound, redirectUrl)
  }

如果是ajax请求,返回4xx json响应,让浏览器主动重定向。

 axios.defaults.headers.common['X-Requested-With']="XMLHttpRequest";
 axios.request({    
            method: 'get',
            url: '/login',
            validateStatus: function (status) {
                return status >= 200 && status < 300 || status === 403; 
            },
        }).then((resp)=> {
            if (resp.status===200  && resp.data.code === 200) {
               ......
            }else{
                window.location.href = resp.data.msg
            }
        })   

标签:status,axios,302,响应,ajax,显式,resp
From: https://www.cnblogs.com/JulianHuang/p/17739090.html

相关文章

  • ajax post请求爬肯德基餐厅
    importurllib.requestimporturllib.parseimportjsondefgetKenData(index):headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.110Safari/537.36Edg/96.......
  • 爬虫ajax的post请求肯德基官网
    #1页#http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname#post#cname:北京#pid:#pageIndex:1#pageSize:10#2页#http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname#post#cname:北京#pid:#pageIndex:2#pageSize:10i......
  • 2023-2024-1 20231302 《计算机基础与程序设计》第一周学习总结
    作业信息这个作业属于计算机基础与程序设计https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01作业目标快速浏览一遍教材计算机科学概论,课本每章提出至少一个自己不懂的或最想解决的问题并在期......
  • 使用VS2008开发运行在.net 2.0环境下的 ASP.NET AJAX 网站
    前段时间想做个博客系统,用着vs2008很顺手,所有准备在上面开发。在选择JS框架的时候看重了asp.netajax,但是后来查阅资料,发现vs2008下面开发的asp.netajax程序在.netframework2.0下面没法部署运行,原因都是可爱的微软在集成路上啊...今天去www.asp.net网站看,见BradAbrams写的一篇......
  • 戴尔OptiPlex 3020升级BIOS刷入NVME驱动
    前提:戴尔OptiPlex3020的主板是H81的,DELL官网的bios是不支持nvme启动的。我也是在外网找的,然后根据自己的情况刷的。目前电脑刷了后是可以直接选择nvme的ssd启动的。外网链接如下:https://www.tachytelic.net/2021/12/dell-optiplex-7020-nvme-ssd/简单的说下步骤:1、先从DELL官......
  • 最新国产低功耗,远距离终端芯片-PAN3029
      磐启微持续不断通过Chirp技术创新推动窄带物联网发展。ChirpIoT™终端芯片方面,磐启微首先推出了PAN3028/3031,此后又推出更低功耗、更高速率的PAN3029,针对下一代终端芯片将会往更低功耗、更高速率、更优灵敏度方向发展。ChirpIoT™网关系统,磐启微已经推出了DTM-CC016A,关于下一......
  • ajax调用后台controller方法时报415 (Unsupported Media Type)错误
    spring mvc 下,ajax调用后台controller方法时报415(UnsupportedMediaType)错误错误:ajax的post方法调用后台controller方法时报错:415(UnsupportedMediaType)。下面是错误时的代码前端:varurl=“xxx/xxQuery.action”;var params={year:‘2017’}ajax(url,params,functio......
  • 3302. 表达式求值
    3302.表达式求值题目:3302.表达式求值-AcWing题库“表达式求值”问题,两个核心关键点:(1)双栈,一个操作数栈,一个运算符栈;(2)运算符优先级,栈顶运算符,和,即将入栈的运算符的优先级比较:如果栈顶的运算符优先级低,新运算符直接入栈以1+2+3x4x5举例,看是如何利用上述两个关键点实施计算......
  • 2023021885
    2023021885杨少雄swordnewnew的主页-博客园(cnblogs.com)开朗数据库,HTML滑板,摩托车前端工程师希望大家玩的开心,在这次的合作中相互学习,相互进步......
  • urllib_ajax的get请求豆瓣电影第一页
    #get请求#获取豆瓣电影的第一页的数据并且保存起来importurllib.requesturl='https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20'headers={'User-Agent':'Mozilla/5.0(WindowsNT......