1.强制缓存
- [1]定义
- 强制缓存就是说在第一次访问服务器获取到数据之后,在过期时间以内不会去重复请求,而是通过浏览器缓存拿去数据;
- 过期时间:在响应头中存在一个属性
- http1.1版本 :强制缓存通过Cache-Control来实现
- Cache-Control存在多个属性一般使用 max-age设置时间
- max-age:缓存的资源将会在xxx秒后过期;
- Cache-Control存在多个属性一般使用 max-age设置时间
- http1.0版本中:通过expires来实现;
- expires标是未来资源会过期的时间;
- 注:为了兼容性,两个版本的强制缓存都会被实现,http 1.1 版本的实现优先级会高于 http 1.0 版本的实现;
- 状态码200
- http1.1版本 :强制缓存通过Cache-Control来实现
- 获取数据:在有效期时间内,浏览器会直接在本地缓存中读取数据,若是超出时间,浏览器会重新发送请求,获取资源!
- [2]举例说明
- 当我们在发送请求获取图片(图片验证码)的时候,图片一般使用的是强制缓存;
- 也就是说,当服务器中的数据发生了改变,我们获取的数据还是原来的!
- 原因:因为浏览器在资源的有效期内,并不会向服务器发送请求(不会直到数据发生了改变)
- 解决:
- 使用路经拼接时间戳,使url不同,浏览器会发送数据;
- 使用post请求,因为post请求不会发生强制缓存的现象;
- 当我们在发送请求获取图片(图片验证码)的时候,图片一般使用的是强制缓存;
实例-图片的强制缓存
需求:我们在进行登录的时候使用的验证码为图片格式,当点击切换时发现 请求发送了,但是图片没有更换。
原因:该请求具有强制缓存。get请求+请求地址不变
解决:
- 可以修改请求的方式,如改为post(但是没有必要)
- 可以在url后面拼接一个参数,参数值为时间戳,保证请求地址发生改变,这样浏览器就会去发送请求而不是使用本地的缓存了。
2.协商缓存
- 定义:协商缓存每次获取数据都会向服务器通信,并且会增加缓存标识。
- 步骤
- 第一次请求服务器,服务器会返回资源,并且返回一个资源缓存标识,一起存储到浏览器缓存数据库;
- 第二次请求服务器,浏览器将缓存标识发送给服务器;
- 服务器拿到标识后检查标识是否匹配;
- 匹配:返回304状态码,表示资源没有更新,浏览器读取本地缓存中的数据;
- 不匹配:表示资源已经更新,会将新的数据与新的标识一起返回到浏览器;
- 版本
- 在http1.1版本
- 第一次发送请求:服务器通过Etag来设置响应头的标识;
- 存储到缓存中;
- 第二次发送请求:服浏览器将信息放在If-None-Match中去访问服务器;
- 相同,返回304,表示资源没有更改;
- 第一次发送请求:服务器通过Etag来设置响应头的标识;
- 在http1.0版本
- 第一次发送请求,通过Last-Modified来设置响应头表示,将资源最后修改时间填入;
- 第二次请求时:浏览器将If-Modified-Since中携带的时间与资源修改时间做对比
- 一致,返回状态码304,读取本地资源;
- 不一致,表示资源已经更新
- 在http1.1版本