Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >不能显式拦截ajax请求的302响应?

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

作者头像
有态度的马甲
发布于 2023-10-06 06:33:54
发布于 2023-10-06 06:33:54
29200
代码可运行
举报
文章被收录于专栏:精益码农精益码农
运行总次数:0
代码可运行

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

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

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

利用axios库发起请求[1]:

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

伪代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   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标准[3]:readystatus=2, All redirects (if any) have been followed and all headers of a response have been received.

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


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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  if  req.isXhr {
     c.JSON(http.StatusForbidden, gin.H{
          "code": 403,
          "msg":  redirectUrl}) 
  }else {
      c.Redirect(http.StatusFound, redirectUrl)
  }

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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
            }
        })   
引用链接

[1] 利用axios库发起请求: https://www.geeksforgeeks.org/which-http-response-status-codes-result-in-then-and-which-in-catch/ [2] ValidateStatus配置: https://axios-http.com/docs/handling_errors [3] ajax标准: https://xhr.spec.whatwg.org/#states [4] github: https://github.com/axios/axios/issues/932#issuecomment-307390761

全文原创,希望得到各位反馈,欢迎斧正交流, 若有更多进展,会实时更新到[左下角阅读原文]。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-01 18:07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
总结Vue3 的一些知识点:Vue3 Ajax(axios)
Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中。
爱学iOS的小麦子
2023/05/26
1.9K0
Java Web 中的 request、response、redirect、forward 详解
Power
2025/04/02
1160
Axios基本使用
Axios Axios 是一个基于promise的HTTP库,可以用在浏览器和node.js中。
ZEHAN
2020/10/29
1.9K0
2022秋招前端面试题(五)(附答案)
用CSS实现扇形的思路和三角形基本一致,就是多了一个圆角的样式,实现一个90°的扇形:
helloworld1024
2022/08/08
5570
【收藏干货】axios配置大全
//当实例创建时候修改配置 instance.defaults.headers.common["Authorization"] = AUTH_TOKEN; 3、 配置中的有优先级
super.x
2019/04/12
1.1K0
详细自定义封装Axios请求库,你还不会二次封装吗?
使用Vue的时候,Axios几乎已经是必用的请求库了,但是为了更方便搭配项目使用,很多开发者会选择二次封装,Vue3就很多人选择二次封装elementPlus,那其实,Axios我们也是经常会去封装的。
JanYork_简昀
2022/09/19
6.2K0
详细自定义封装Axios请求库,你还不会二次封装吗?
一、Axios基础
参考文档:http://www.axios-js.com/zh-cn/docs/ axios库基本概念 它是一个类库,基于promise管理的Ajax库 关于get、post方法的参数 url 第一个参数,请求的url地址 options 对象。 get方法 axios.get('https://v1.hitokoto.cn/', { params: { c: "b" } }).then(function (res) { console.log(res); })
Dreamy.TZK
2020/08/25
1.6K0
Servlet基础入门
Servlet 是 Server Applet 的简称,译为“服务器端小程序”。Servlet 是 Java 的一套技术标准,规定了如何使用 Java 来开发动态网站。
十玖八柒
2022/08/01
8690
Servlet基础入门
【计网】从零开始学习http协议 --- 通过http实现客户端交互
上一篇文章中我们对浏览器发送的请求进行了一个初步的处理,获取到了一些基础信息。 其中我们得到的URL是十分重要的,这是客户端请求的文件的路径,当然是在网络根目录的之下的路径。网络根目录需要由我们自己来进行设置,可以设置任何位置!这里我将其与源代码放在了同一路径下:
叫我龙翔
2024/09/30
1250
【计网】从零开始学习http协议 --- 通过http实现客户端交互
一次奇怪的http状态码改变
最近将一个很久没有更新的部署在物理机上的一个老服务迁移到k8s时,发现在gitlab ci跑pytest的过程中出现以下报错:
职场亮哥
2020/10/10
9430
Vue:前后端数据联调
前言 前后端分离以后,数据的获取渲染都由前端完成。后台只提供纯粹的数据,以JSON为主。因此在获取数据的过程中会遭遇诸如跨域、HTTP请求错误、前端提交数据格式错误等诸多问题。因此本文将结合自身开发经验,讨论在前后端分离过程中,数据获取的一些经验。 什么是跨域? 这些年我们处理过的跨域——援引博客园 幻精灵的一篇文章,本文详细的介绍了什么是跨域,以及相关的跨域方法 JAVA中的解决方法 常规跨域请求Http Header 设置 response.setHeader("Access-Control
MrTreasure
2018/05/10
1.6K0
2022前端笔试题总结
then只会捕获第一个成功的方法,其他的函数虽然还会继续执行,但是不是被then捕获了。
loveX001
2022/11/11
2.2K0
Vue3 Ajax(axios)(上)
Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中。
陈不成i
2021/07/28
2K0
【axios】002-axios发起请求
axios.interceptors.request.use():添加请求拦截器;
訾博ZiBo
2025/01/06
1350
HTTP实用指南 - 笔记
HTTP( Hyper Text Transfer Protocol ) 模型如下图所示,是一个应用层(见上图)的协议,基于 TCP 协议,它有如下特点:
TagBug
2023/03/17
8810
HTTP实用指南 - 笔记
【JavaWeb】学习笔记——Ajax、Axios
AJAX(Asynchronous JavaScript And XML):异步的JavaScript 和 XML
鸡先生
2022/10/29
8730
【JavaWeb】学习笔记——Ajax、Axios
常见的http请求参数和响应参数,前后端交互参数说明
概念:Hyper Text Transfer Protocol 超文本传输协议 传输协议:定义了客户端和服务器端通信时,发送数据的格式。 特点:
共饮一杯无
2022/11/28
1.5K0
常见的http请求参数和响应参数,前后端交互参数说明
手给 Safari 提了一个Bug,让我意外收获了这些新知识
前段时间,项目在进行 JWT 改造,用户的身份认证从 cookie 改成了 token。
ConardLi
2023/01/09
1.5K0
手给 Safari 提了一个Bug,让我意外收获了这些新知识
浅析http报文
在上述过程中第三步浏览器给服务器发送的是http请求报文,第五步服务器将资源发送给浏览器的过程中发送的是http响应报文。
你的益达
2020/08/17
7800
axios介绍与使用说明 axios中文文档
本周在做一个使用vuejs的前端项目,访问后端服务使用axios库,这里对照官方文档,简单记录下,也方便大家参考。 Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中。github开源地址https://github.com/axios/axios 特性 在浏览器中创建 XMLHttpRequests 在 node.js 则创建 http 请求 支持 Promise API 支持拦截请求和响应 转换请求和响应数据 取消请求 自动转换 JSON 数据 客户端支持防御
JadePeng
2018/04/16
84.4K0
相关推荐
总结Vue3 的一些知识点:Vue3 Ajax(axios)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验