Video标签添加跨域头信息后的缓存问题

这篇具有很好参考价值的文章主要介绍了Video标签添加跨域头信息后的缓存问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题复现

  1. 第一步的页面,这个页面有两个 video标签,他们的 src一样
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
    <div class="container">
       <video controls width="400"  height="300" src="http://localhost:3000/video.mp4" alt="" ></video>
    </div>
</body>
</html>
  1. 为第video标签添加参数 crossorigin=“anonymous” ,那么会报错。“xxxx” has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
    <div class="container">
       <video controls width="400" crossorigin="anonymous"   height="300" src="http://localhost:3000/video.mp4" alt="" ></video>
    </div>
</body>
</html>

问题分析

这里的video.mp4的静态文件服务器,服务端的代码用 express写的,后面会贴出,我们这里分析一下http协议。

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, PUT, DELETE, HEAD
Access-Control-Max-Age: 7200
ETag: "14a75b-+3U9KJ4h8BvTNuddNn1RqzOBBfA"
Content-Type: video/mp4
Content-Length: 1353563
last-modified: Mon, 10 Jul 2023 04:05:15 GMT
Date: Mon, 10 Jul 2023 07:32:31 GMT

通过上面的response请求,我们可以看出,这里并没有使用Cache-Control 或expires来控制浏览器的缓存,那么缓存的重任就落到了last-modified的肩膀上,通过查资料,我们发现last-modified一般是根据与现在的时间差的 10%来作为缓存事件,而且每个浏览器厂家的实现也不一样。文章来源地址https://www.toymoban.com/news/detail-564483.html

规避这个问题

  1. 如果一开始就添加了 crossorigin=“anonymous”,那么理论上不会遇到当前这个问题。
  2. 如果一开始在没有添加 crossorigin="anonymous"的时候,添加了 Cache-Control或 没last-modified头,也不会遇到这样的问题
  3. 如果一旦报错,浏览器则不会发送任何http请求去纠正这个问题,js 也没办法控制浏览器去清理前端的缓存。

解决办法

  1. 已经出现问题的情况下,最有效的办法是请客户手动的强制刷新,清理缓存。
  2. 前端代码对报错的video检测资源状态,跳过这个资源的播放或做其他的操作。

服务端代码

const express = require('express');
const app = express();
const path = require('path');
const fs = require('fs');
const etag = require('etag');

// Custom CORS middleware
const cors = (req, res, next) => {
    const origin = req.headers.origin;
  
    if (origin) {
      res.setHeader('Access-Control-Allow-Origin', '*');
      res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, HEAD');
      res.setHeader('Access-Control-Max-Age', '7200');
    }
  
    next();
};

app.use(cors);  // Use cors middleware for all routes

app.use(express.static('public'));

app.get('/video.mp4', function(req, res) {
    const filePath = path.join(__dirname, 'public', 'v.mp4');
    const stat = fs.statSync(filePath);
  
    fs.readFile(filePath, (err, data) => {
      if (err) {
        console.error(err);
        res.status(500).send('Server Error');
      } else {
        res.setHeader('ETag', etag(data));
        res.setHeader('Content-Type', 'video/mp4');
        res.setHeader('Content-Length', stat.size);
        res.setHeader('last-modified', stat.mtime.toUTCString());
        //res.setHeader('Cache-Control', 'public, max-age=10');
        res.removeHeader('Connection')
        res.removeHeader('Keep-Alive')
        res.end(data);
      }
    });
  });
app.listen(3000, function() {
  console.log('Listening on port 3000...');
});

到了这里,关于Video标签添加跨域头信息后的缓存问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 关于使用video标签插入视频时,视频无法播放的问题

    写代码遇到一个问题:使用video标签插入视频时,在chrome中无法播放,只显示了一个封面图片,在ie却可以播放。 video的使用是看别人的: 由于照搬别人的代码,我写的代码如下: 然后出现问题:只有个封面,不能播放视频 解决过程: ❌我以为是浏览器兼容问题,查资料发

    2024年02月11日
    浏览(71)
  • ios和安卓手机端使用video标签播放失败的问题

    手机端请求后端接口,返回视频流给前端,然后在手机端进行播放,手机端需要适配ios和安卓,后端在开发好接口后在浏览器、postman调用接口时都能正常播放,安卓客户端也可以正常播放,但是ios播放失败。 刚开始觉得是网速太慢的原因,换了一个更小的视频,仍然不行,

    2024年01月18日
    浏览(50)
  • 【标签bug】video标签部分mp4文件在ios中无法自动播放的问题

    在安卓端和h5页面调试端,video标签下的mp4格式文件均可以播放,但是video标签部分mp4文件在ios中无法自动播放的问题,搜了很多资料有如下解决方案 前四个属性: muted:静音播放,一般浏览器chrome为例,用户需要在页面上操作一次,才能播放视频,不允许用户进入后直接显示

    2024年02月06日
    浏览(63)
  • uniapp使用video标签无法播放视频出现黑屏问题处理

    问题出现情况 并且点击播放后出现报错 解决办法 问题出现的原因可能是video的视频流不兼容或者在f12下无法看见视频文件导致的,所有我们使用computed计算属性来解决这个问题 js html 按照上面的做法 这样问题就解决了 希望能解决大家的问题 一键三连

    2024年02月11日
    浏览(81)
  • 谷歌chrome浏览器无法自动播放video标签视频的问题

    问题根源详见: Chrome中的自动播放政策  https://developer.chrome.com/blog/autoplay/  The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For the Web Audio API, the autoplay policy launched in Chrome 71. This affects web games, some WebRTC appli

    2024年02月11日
    浏览(91)
  • ios中关于video标签poster属性兼容问题(ios视频截帧)

    需求如下 移动端h5页面(微信浏览器下)需要上传视频并回显封面,用户点击中间的播放三角可以进行视频的预览;问题就出现在ios手机上使用video的poster属性并不能显示出视频封面,而安卓手机可以正常显示视频的第一帧; 效果图 问题分析: 在ios系统中有个保护机制, 如果

    2024年02月05日
    浏览(48)
  • 苹果手机video标签播放视频问题(播放mp4视频遇到的坑)

    1.场景描述 服务端上传MP4视频文件,iOS客户端通过URL播放该视频文件。提供视频接口,可以进行视频下载或者直接播放,但是iOS手机无法播放,且PC端safari浏览器也无法播放。 2.问题描述 安卓手机可以正常播放视频,iOS手机无法播放,且PC段safari浏览器也无法播放。 3.问题分

    2024年02月22日
    浏览(52)
  • C++ 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴]

    使用map默认会根据key排序的原理作缓存,队列满了依次推出,抛弃掉过时的数据

    2024年02月14日
    浏览(38)
  • HBuilderX使用uniapp中的video标签开发视频应用APP,出现视频覆盖<view>图层无法遮住等问题如何解决?

    请使用cover-image或cover-view cover-image | uni-app官网 https://uniapp.dcloud.net.cn/component/cover-image.html#cover-image   cover-view | uni-app官网 https://uniapp.dcloud.net.cn/component/cover-view.html#cover-view 情况1:如上图,注意要使用以下位置才能达到遮住的效果   情况2:如上图,就直接用cover-view自定义一

    2024年02月16日
    浏览(54)
  • vue3+pinia用户信息持久缓存(token)的问题

    对博主来说,这是个相当复杂的问题。 当初在使用vue2+vuex进行用户信息持久登录时,写了不下3篇博客,确实是解决了问题,博客链接如下 vue存储和使用后端传递过来的token vue中对token的有效期的理解 vuex刷新页面丢失登录的token信息的解决方案 第一篇博客是记录前端如何使用

    2024年02月13日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包