强缓存:浏览器不会像服务器发送任何请求,直接从本地缓存中读取文件并返回Status Code: 200 OK
200 form memory cache : 不访问服务器,一般已经加载过该资源且缓存在了内存当中,直接从内存中读取缓存。浏览器关闭后,数据将不存在(资源被释放掉了),再次打开相同的页面时,不会出现from memory cache。
200 from disk cache: 不访问服务器,已经在之前的某个时间加载过该资源,直接从硬盘中读取缓存,关闭浏览器后,数据依然存在,此资源不会随着该页面的关闭而释放掉下次打开仍然会是from disk cache。
优先访问memory cache,其次是disk cache,最后是请求网络资源
协商缓存: 向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源
两类缓存规则可以同时存在,强制缓存优先级高于协商缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行协商缓存规则。
服务器和浏览器以GMT格式标准时间约定文件过期时间,用expires字段控制。下次请求时,请求时间小于服务端返回的到期时间则直接使用缓存(没有走到服务端)。
缺点:
- 缓存过期后,不论目标文件是否产生过变化,都会再次读取目标文件并返回到浏览器
- 服务器和浏览器时间可能不同步,缓存使用不精准
Expires: Sun, 20 Apr 2024 12:00:00 GMT
字段值 | 作用 |
---|---|
no-cache | 防止从缓存中返回过期的资源,所以使用之前,需要和源服务器发起请求比对过期时间 |
no-store | 这个指令才是真正的不进行缓存,暗示请求报文中可能含有机密信息,不可缓存 |
max-age | 在指定时间内(单位秒),缓存服务器不再对资源的有效性进行确认,可以使用 |
private | 可缓存性指令,只有某个在通过缓存服务器的时候,得到缓存资源 |
public | 可缓存性指令,所有的用户在通过缓存服务器的时候,都可以缓存这个资源。 |
针对浏览器和服务器时间不同步,加入了新的缓存方案;这次服务器不是直接告诉浏览器过期时间,而是告诉一个相对时间max-age=10
,意思是10秒内,直接使用浏览器缓存。
HTTP响应头中的Date字段表示服务器响应请求的时间,通常以格林威治标准时间(GMT)格式表示。这个时间是用来作为缓存有效期的起始点或基准时间。
Cache-Control
可以使用多个指令,以逗号分隔。
客户端可以在 HTTP 请求中使用的标准 Cache-Control 指令。
Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached
服务器可以在响应中使用的标准 Cache-Control 指令。
Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>
参考资料
Cache-Control - HTTP | MDN (mozilla.org)
服务器比较请求头中的If-Modified-Since
,如果一致则给出304状态码,不返回目标文件;如果不一致,则返回目标文件并告知浏览器目标文件最新的Last-Modified
缺点:
- Last-Modified 过期时间只能精确到秒。无法应对同一秒内文件密集更新的情况
- Last-Modified只匹配时间,不匹配文件内容。无法应对目标文件实际被覆盖然而内容前后未发生改变的情况
应对文件内容不变的情况,在服务器引入Etag响应头,
通常在缓存在下发浏览器时,cache-control
Etag
Last-Modified
三个字段都会带上。
在地址栏输入URL访问资源时强缓存会失效,协商缓存有效。
如果资源由网页中代码加载,则遵循强缓存和协商缓存策略。
参考链接:
【前端浏览器缓存手把手教程】 https://www.bilibili.com/video/BV1r24y127M3/?share_source=copy_web&vd_source=dc1323228f1470bd561672c18d78adf3
每个域名下的cookie 的大小最大为4KB
属性名 | 描述 |
---|---|
name | 名称,创建后不能更改;必填 |
value | 值;必填 |
maxAge | 失效时间,单位秒,,默认-1,负数表示当前为临时Cookie关闭浏览器即失效,0表示删除该Cookie |
secure | 默认false,该字段不是键值对的形式,如果要指定该字段,只要在设置cookie时添加secure字符即可。设置了该字段即表示只有使用SSL链接时Cookie才会发送到浏览器。 |
path | Cookie的使用路径,通过这个字段可以为服务器上特定的文档分配cookie。默认值是设置 Cookie 时的当前目录。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。 |
HttpOnly | 只能由服务端设置。用来控制Cookie是否能通过JS(document.cookie )访问,默认为空表示可以访问 |
domain | 可以访问该Cookie的域名,所有向该域名发送的请求中都会包含这个cookie信息。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。 |
use example:
document.cookie = "username=Darren;path=/;domain=.csdn.net"
CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials
字段。(via跨域资源共享 CORS 详解 - 阮一峰的网络日志 (ruanyifeng.com))
Access-Control-Allow-Credentials: true
另一方面,开发者必须在AJAX请求中打开withCredentials
属性。
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
如果要发送Cookie,Access-Control-Allow-Origin
就不能设为星号,必须指定明确的、与请求网页一致的域名。
参考链接:
cookie的domain属性_cookie domain_545龙哥哥的博客-CSDN博客
关于Cookie的知识的总结 - Fogwind - 博客园 (cnblogs.com)
301状态码表示永久移动,让客户端请求的资源在未来指向新的URL,且为了避免搜索引擎等数据错误,应该使用301来告知浏览器直接自动访问新URL。一个常见的例子就是网站的 HTTPS 化,服务器接收到 HTTP 请求后会发出301回应,告诉浏览器将页面跳转到HTTPS协议上。
302状态码表示临时移动或者重定向,但后续请求依旧会去请求老的url。