web - 如何让浏览器缓存没有永久 URL 的 Web 资源?
问题描述
问题
该网页需要下载多个文件,例如${some_id}.file
. 但
- 它们托管在云服务上,必须从另一个域(例如 )下载
https://some.cloud.com/${some_generated_token}
,这些域不是永久 URL。 - 这些文件可能对当前用户是私有的,因此未经许可的人将无法检索下载 url。
如果前端只是这样做:
fetch(`https://some.cloud.com/${some_generated_token}`)
每次刷新页面时都必须下载,因为 URL 正在更改,因此它不能使用这些电子标签内容进行缓存,并且用户不会喜欢它。
方法一
编写我自己的文件服务器,以便前端从https://my-server.com/download/${some_id}.file
.
服务器在下载前检查用户的权限。如果检查通过,则发送重定向(302 临时移动)到真正的下载 url https://some.cloud.com/${some_generated_token}
,否则返回错误。
也许我应该etag
在响应中放一个标题,从真实的复制而来。我不确定这是否可行。是否可以使浏览器缓存从重定向 URL 下载的文件?
方法二
为客户端手动实现一个缓存系统,它会在必要时在后台下载真实文件。所以文件实际上是从缓存而不是从云中加载的。文件由类似${some_id}_${checksum}
.
缺点可能是我必须手动管理存储。(所以要么我必须用另一个设置来打扰用户来决定容量,要么浏览器决定这个,我没有办法协商。我不确定这个。)
那么最好/可能的方法是什么?以及如何实施?
解决方案
方法 3(智能代理):在您自己的主机(提供前端服务的地方)上提供一个稳定的 URL,在标头中传递令牌,并让该端点从云系统中提取文件(使用令牌) 并将其转发到前端。这只有在 A) 文件大小不是很大的情况下才有意义,它会给您自己的系统传输量带来巨大的成本,并且 B) 您确实有一个后端来解决这个问题。
推荐阅读
- javascript - 通过浏览器查看错误,nodejs
- android - 未找到样式属性“android:attr/attr/gravity”,
- php - 更新架构时如何编辑 symfony 学说的 sql 命令?
- c# - 游戏在编辑器中运行良好,而不是在构建中
- python - 如何在知道用户 ID 的情况下发送 DM 消息?
- azure - 如何从 Azure 获取诊断日志的信息
- java - Java Api Callbacks 在 dotnet 框架 4.5 及更高版本上崩溃
- ssl - 如何在kafka集群中启用多个监听器
- c# - Xamarin Forms 绑定来自 Resources/Drawable 文件夹的图像
- mysql - node、express、mysql更新多行不同的值数组