前端拦截302重定向

news/2024/10/23 0:36:49/

背景:  根据业务场景需要拦截302做后续的逻辑处理

尝试一: : axios拦截

javascript">、、、、、async created() {// 获取302请求返回的location后手动修改video的src路径let targetSrc;try {await axios.get(this.video).then((res) => {const { headers, status } = res;const { location } = headers;if(status === 302) {targetSrc = location}targetSrc = location;});} catch (error) {console.error(error);}this.videoSrc = targetSrc; // 替换 video 标签的src},、、、、、、

 发现没办法拦截, 仔细对照了获取到的 response 后,发现在代码中实际获取到的 response 并非 302 请求所返回,而是 get 了重定向的后的 response,这里看起来时axios自动进行了重定向并获取了重定向后的response。

那么有没有办法关闭axios的自动重定向行为呢?查阅axios文档时发现axios的一个配置:maxRedirects

但是 maxRedirects 是node环境下的配置,显然不符合业务需求,所以这里pass。而后查阅了文档,并没有看见其他可以处理axios重定向的配置了。如此看来 axios 是无法对302请求进行拦截了,不过为什么axios无法做到拦截302请求呢。

查阅后了资料后发现:

对于XMLHttpRequest而言,readyState = 2 时,此时状态为已经获取到response并且所有的重定向行为都已完成。

大致的流程就是:

ajax -> browser -> server -> 302 -> browser重新get 重定向的 location -> server -> browser -> 回调

综上,看来axios无法做到直接拦截302请求。

不过除了 XMLHttpRequest , 还有 fetch API。

尝试二: 使用fetch API

前面淌了axios的雷,那么这次我们就直接看 fetch 是否支持拦截302请求。

这里发现,fetch API可以支持配置请求重定向处理方式

  • follow: 跟随跳转(默认)
  • error:阻止跳转并抛出异常(catch)
  • manual:阻止跳转

看起来 fetch 所支持的配置刚好可以解决 axios 无法拦截重定向请求的问题,那么接下来就尝试用fetch替代 axios:

javascript">、、、、、、async created() {// 获取302请求返回的location后手动修改video的src路径let targetSrc;try {await fetch(this.video, { redirect: 'manual' }).then((res) => {const { headers } = res;const { location } = headers;targetSrc = location;});} catch (error) {console.error(error);}this.videoSrc = targetSrc;  // 替换 video 标签的src},
、、、、、、

看似这里使用后fetch完美的解决了拦截重定向请求,那么接下来我们直接取到location就可以了。不出意外的话意外要出现了——果然在最后的一步又卡住了。

从 fetch manual模式下输出的获取的response 可以看到不少内容,不过其中的body、hearders、statusText是空的,同时type 属性为 “opaqueredirect”,我们看下图

我们从通过fetch manual 模式下拿到的response 中 type 为 “opaqueredirect”不难看出,此时的response属于“不透明重定向过滤响应”,那么对于该类型响应的特点就是,response 中: status为0、statusText为空、header为空等。没错,headers为空

到了这里,其实已经实现了拦截302请求的目的,但是却无法获得headers中的信息,为此,想要从302请求中获取到location信息仅差一步之遥,那么这里还有什么办法可以获取吗?很遗憾,目前看来 WHATWG 组织认为出于安全考虑,貌似并不太愿意在 opaqueredirect 类型响应中暴露太多信息,其中也包含了所需要的location地址

还有一种场景, 使用fetch请求接口时, 请求不会包含任何凭证。这意味着即使用户已经登录,请求也不会携带cookies或HTTP认证信息。这是credentials : 'omit' 这个参数的默认行为。

credentials 的选项解释

  1. 'omit':请求不会包含任何凭证。这意味着即使用户已经登录,请求也不会携带cookies或HTTP认证信息。这是默认行为。

  2. 'same-origin':请求仅在同源的情况下包含凭证。如果请求的目标URL与请求发起的源(协议、域名、端口)相同,则请求会包含凭证。这是fetch API的一个常用设置。

  3. 'include':请求总是包含凭证,无论请求的目标URL是否与请求发起的源相同。这意味着即使是跨域请求也会携带cookies和其他凭证信息。

如果需要携带相关凭证, 可以设置include

javascript">fetch('https://example.com/data', {method: 'GET',headers: {'Content-Type': 'application/json',},credentials: 'include', // 设置为 include
})
.then(response => {if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}return response.json();
})
.then(data => {console.log(data);
})
.catch(error => {console.error('Fetch error:', error);
});

总结
总体看下来,本次尝试并没有找到可以直接拦截重定向请求并获取到location的途径,如果我们有类似的需求场景的话,可能只能取巧了:

  • 与后端约定规则,将前端对于后端可能重定向的且重定后前端必须获取到重定向location的请求不予返回3xx状态码,转而返回2xx、4xx或者其余状态码,此时axios可以进行拦截获取信息;
  • 在使用axios请求之前,先使用 fetch 请求一次进行拦截,该方式可以成功拦截302请求,能获取其中部分信息,但是该方法依旧无法获取location,无法满足本次探索的需求,不过可以适用于拦截302请求后做定制化逻辑处理等场景。

http://www.ppmy.cn/news/1541196.html

相关文章

开源医疗管理的未来:参与码良诊所管理系统,助力智能医疗

开源医疗管理的未来:参与码良诊所管理系统,助力智能医疗 引言 在过去的六个多月里,我们公司 码良互联网科技有限公司 专注于开发一个全面、智能的诊所管理系统,旨在帮助中小型医疗机构提升运营效率、优化患者管理流程、以及降低…

CentOS 7 安装gcc编译环境

有时需要使用源码安装某个应用程序,有时还需要对源码进行一定程度的修改和定制才能满足业务需求,有时需要在linux环境下开发某个特定功能的c程序,此时都需要用到gcc编译环境,此时就需要安装gcc编译环境。 在 CentOS 7 上安装 C 编…

Spring Ai 对接智谱清言结合vue(清测成功)

智谱文档&#xff1a;智谱AI开放平台 注意:springboot版本要在3.0以上&#xff0c;pom.xml要配置下载的源。 pml文件如下 建议使用下科学上网~~~ <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…

linux 查看CPU信息 核心数 逻辑核心数

cat /proc/cpuinfo Linux操作系统的CPU信息被保存在/proc/cpuinfo文件中&#xff0c; processor: 这是逻辑CPU的编号&#xff0c;从0开始。 physical id: 如果你有多个物理CPU&#xff0c;每个物理CPU都会有一个唯一的ID。 core id: 每个核心的唯一ID。有了HT技术后&#xf…

svn安装完成,但在cmd窗口运行是报错svn不是内部或外部命令

已经安装了svn&#xff0c;但是在cmd中输入svn命令的时候提示svn不是内部或外部命令是因为没有安装svn client。 解决办法&#xff1a; windows安装svn的时候默认是不安装 svn comand line这个东西的&#xff0c;重新安装svn客户端&#xff0c;将“command line client tools”…

Lua字符串

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua作为一种轻量级、高效的脚本语言&#xff0c;在字符串处理方面提供了丰富的功能和灵活的操作方式。字符串在Lua中是一系列的字节&#xff0c;可以包含任意…

OpenLayers:构建现代Web地图应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 OpenLayers&#xff1a;构建现代Web地图应用 文章目录 OpenLayers&#xff1a;构建现代Web地图应用1. 简介2. 为什么选择 OpenLa…

常见Web知识1

List item 常见Web知识1 JSON&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人类阅读和编写&#xff0c;同时也易于机器解析和生成。它通常用于客户端和服务器之间的数据传输。 JSON 结构 JSON 主要由两…