强缓存
不需要进行http请求,根据上次请求返回的相关字段来判断资源是否已过期
不同http版本使用的缓存字段:
| http版本 | 字段名 | 返回值 | 不足 |
|---|---|---|---|
| HTTP/1.0 | Expires | 一个具体的时间点 | 服务器的时间跟客户端的时间可能不一致 |
| HTTP/1.1 | Cache-Control |
|
区分:
- no-cache:可以在客户端缓存资源,但只能是协商缓存,即 每次使用缓存前都需要服务器重新校验(返回状态200使用新资源,304使用客户端缓存资源)
- no-store:每次都从服务器获取新资源
协商缓存
若没有强缓存或者强缓存已过期,需携带相关字段(这个字段的值来自上次请求的返回)发起请求,服务器根据这个字段判断是否使用缓存
有两个字段可以实现:
| 上次请求响应的字段 | 请求携带的字段 | 结果 | 不足 |
|---|---|---|---|
Last-Modified | If-Modified-Since | 如果If-Modified-Since的时间小于资源的最后修改时间,不使用缓存直接进行常规的请求响应过程;反之,返回304,浏览器使用缓存 | 不够精准。 1. 如果只编辑文件但不更改文件内容也会导致缓存失败 2.Last-Modified 能够感知的单位时间是秒,如果文件在 1 秒内改变了多次,那么这时候的 Last-Modified 并没有体现出修改了。 |
ETag:服务器根据当前文件的内容,生成的文件唯一标识 | If-None-Match | 如果If-None-Match与资源的ETag不一致,不使用缓存直接进行常规的请求响应过程;反之,返回304,浏览器使用缓存 | 性能上低于Last-Modified |