ETag、If-None-Match判断文件是否发生变化

场景

公司的一款故事机需要从我们后台(我们后台存的是阿里云CDN的地址,实体文件在阿里云CDN)下载一个资源包(可以简单理解成多个音频文件组成的资源包),下载到本地之后实现本地播放。但是后台对应的资源包运营同事存在修改的情况,当资源修改时故事机需要重新下载,没有修改就不需要重新下载就使用上次已经下载好的资源包。

分析

方法一

服务器维护一个资源包版本号

在服务器保存一个资源的版本号,运营同事没修改一次资源包的内容版本号就++。故事机请求资源的时候带上上次的版本号,服务器接收到故事机传过来的版号之后和本地版本号做一个对比,如果服务器最新版本号 > 故事带过来的版本号的话就放返回最新资源,如果服务器最新版本号 = 故事带过来的版本号的话就告诉故事机不需要下载资源。

弊端:

1.服务器需要维护资源包版本号

2.服务器每次讲本地和故事机传过来的版本号对比,消耗服务器性能

方法二

使用http1.1版本的ETag结合If-None-Match

ETag是一种将资源以字符串形式做唯一标识的方式,服务器会为每一份资源分配唯一的ETag值。If-None-Match的值和ETag的值不一致时,服务器才会处理请求。两个值一致时,服务器就会返回304

优势:

1.服务器不需要维护资源包版本号

2.更新资源的版本比对的压力不在服务器,转嫁到了阿里云的CDN

实现

1.第一次请求资源包的时候(If-None-Match可以填空),我们能从响应头中得到阿里云CDN给我们返回的Etag信息

2.假如在我们请求第一次资源之后,我们对应的资源包文件没有修改,我们就把请求头中的If-None-Match值写成上次响应头中的Etag的值。此时响应状态码会是304,告诉我前端资源没有发生变化

猜你喜欢

转载自blog.csdn.net/qq_27062249/article/details/118796960