前端拦截302重定向踩坑之旅

这篇具有很好参考价值的文章主要介绍了前端拦截302重定向踩坑之旅。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

工作项目系统管理着大量作品内容,其中不乏视频资源。某天有运营反馈,在系统内使用播放器下载视频时会提示网络错误下载失败的问题:

app重定向 302,前端

复现时,发现该现象为偶发,并非所有视频资源均不可下载。app重定向 302,前端

经过排查,发现该问题原因是:部分后端返回的视频链接失效,无法直接播放,需要302导向到新的资源位置。而这里的播放组件中video的src指向的是原始链接(未302前的路径),也是因此导致在没有播放这个视频,也就是没有加载视频数据之前直接下载视频的话,会导致video标签无法获取到资源而报错。

这里给到的临时解决方案是用户先点击播放视频后再点击下载,表面上看是功能依旧可用,但是却增加了用户的操作路径,降低了效率,并没有从根本上解决问题。

不过既然知道了问题之后,就可以着手优化了。最开始想到的是,既然是由于src所指向的链接可能出现302导致资源指向有问题,干脆直接在视频组件中手动处理下:

1、拿到原始链接;

2、手动请求该链接;

3、判断响应结果是否为302,是则获取location并替换src,否则代表无需处理;

尝试axios拦截

说干就干,既然有了思路,我们直接开始着手优化代码。

app重定向 302,前端

通过查看正常的请求,可以看到我们所需要的location信息挂载在response的headers对象中,接下来完善下组件能力,created时请求资源链接看看效果吧:

、、、、、

async created() {
    // 获取302请求返回的location后手动修改video的src路径

    let targetSrc;

    try {
      await axios.get(this.video?.videoinfo?.playurl).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
  },

、、、、、、

 简单的手动 get 了一次原 src 的资源路径,看起来没啥问题,那么就跑起来吧!

发现问题

跑起来后发现一个问题——视频都无法播放了。这里觉得有点奇怪,于是在控制台输出了一些结果 console.log(res)。

唉?location呢?在 network 中看的一清二楚的location咋找不到了呢?

app重定向 302,前端

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

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

app重定向 302,前端

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

查阅后了资料后发现:

app重定向 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可以支持配置请求重定向处理方式app重定向 302,前端

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

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

、、、、、、

async created() {
    // 获取302请求返回的location后手动修改video的src路径
    let targetSrc;

    try {
      await fetch(this.video?.videoinfo?.playurl, { redirect: 'manual' }).then((res) => {
        const { headers } = res;
        const { location } = headers;

        targetSrc = location;
      });
    } catch (error) {
      console.error(error);
    }

    this.videoSrc = targetSrc;  // 替换 video 标签的src
  },
、、、、、、

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

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

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

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

总结

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

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

参考:

Fetch Standard

https://xhr.spec.whatwg.org/#states 文章来源地址https://www.toymoban.com/news/detail-857402.html

到了这里,关于前端拦截302重定向踩坑之旅的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 爬虫爬取数据遇到302,301重定向如何获取重定向后的地址(完美解决)

    只需要将请求头修改成如下,可以根据需要进行更改 然后就可以获取目标重定向后的地址 完整java语言get请求获取重定向地址方法

    2024年01月22日
    浏览(33)
  • 解决前后端分离Vue项目部署到服务器后出现的302重定向问题

    最近发现自己开发的vue前后端分离项目因为使用了spring security 安全框架,即使在登录认证成功之后再调用一些正常的接口总是会莫名奇妙地出现302重定向的问题,导致接口数据出不来。奇怪的是这个问题在本地开发环境并没有,而是部署到了服务器之后才会有。 接口无法加

    2024年02月13日
    浏览(38)
  • 图文并茂教你模拟302接口,实现js中axios,fetch遇到302状态码后跳转的多种方案axios,fetch成功响应拦截302

    日常工作中,我们会使用fetch,或者axios发起请求来获取数据,但是当我们遇到一些特殊需求的时候,使用不同库之后,会得到不同的结果,例如302,308的状态码,那么我们应该怎么处理这两种情况呢? 如何使用多种方案实现前端代码+302后端接口实现页面跳转? fetch 发送GET 或者

    2024年02月20日
    浏览(35)
  • 前端遇到302处理方式以及设置第三方Cookie研究

    背景:由于认证中心网关检测到用户是未登录态情况下的话,会将用户重定向到认证中心的登录页。 ​ 此时,假如是使用Oauth2协议,登录成功后,前端需要带着登录成功的信息(jwt),访问/Oauth2/1/authorize接口,此时该接口将会重定向回redirect_uri的地址,这个时候的 重点在于

    2024年02月11日
    浏览(26)
  • kali安装beef-xss(笔者的踩坑之旅)

    简介:         BeEF-XSS是一款非常强大的web框架攻击平台,集成了许多payload,可以实现许多功能! 安装步骤,附带笔者的一些踩坑之处 1、更改源vim /etc/apt/sources.list , 修改如下内容(kali里面粘贴是ctrl+shift+v),修改完成后保存退出(Esc+:+wq)即可 deb https://mirrors.a

    2024年02月08日
    浏览(30)
  • FFmpeg5.1.3编译动态库踩坑之旅(基于Linux虚拟机)

    环境准备 1.Windows安装Oracle VM VirtualBox 7.0.10,安装ubuntu-22.04.3。 坑一 :无法往虚拟机里拖放复制文件,解决办法:登录Ubuntu虚拟机时切换到xorg方式登录,参考地址:Ubuntu Desktop 22.04 无法实现拖放复制操作解决办法-CSDN博客 下载文件 下载ndk25 官网下载:ndk官网 网盘下载:andr

    2024年02月07日
    浏览(29)
  • 【安卓安全】透明代理定向抓APP包

    参考了以下大佬的文章: 文章一 文章二 文章三 工具:iptables + redsocks2 + Charles 要使用charles抓https的流量,就需要正确配置证书,并将证书设置为系统证书,这里开始踩了坑,我只是配置了用户证书,在安卓7之后的版本中,一般的直接安装证书,只是安装到用户证书,而要想

    2024年02月14日
    浏览(31)
  • uni-app路由拦截

    新建一个auth.js /**  * @description 权限存储函数  */ const authorizationKey = \\\'Authorization\\\' export function getAuthorization() {   return uni.getStorageSync(authorizationKey) } export function setAuthorization(authorization) {   return uni.setStorageSync(authorizationKey, authorization) } export function removeAuthorization(authorization) {  

    2024年02月15日
    浏览(24)
  • 实现一个 SEO 友好的响应式多语言官网 (Vite-SSG + Vuetify3) 我的踩坑之旅

    在 2023 年的年底,我终于有时间下定决心把我的 UtilMeta 项目官网 进行翻新,主要的原因是之前的官网是用 Vue2 实现的一个 SPA 应用,对搜索引擎 SEO 很不友好,这对于介绍项目的官网来说是一个硬伤 所以在调研一圈后,我准备用 Vite-SSG + Vue3 + Vuetify3 把官网重新来过,前后花

    2024年03月11日
    浏览(42)
  • 探索前端框架的世界:一场前端之旅

    在网络世界中,网页开发领域的一颗明星是前端框架。这些框架为开发者提供了丰富的工具和技术,帮助他们构建出漂亮、高效的网页应用。现在,让我们随着小明的故事一起来探索一下吧。 小明的梦想 小明是一位年轻有为的前端开发者,他有一个梦想:构建一款独具特色

    2024年02月22日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包