你们好,我是林一一,这是一篇关于浏览器 缓存原理 和 本地存储 的文章,后续回持续推出关于,浏览器原理的文章。
所谓浏览器的缓存,就是浏览器经过HTTP
请求网络资源后将资源留在本地的一种行为。在页面上点击返回和前进的按钮
就是利用浏览器的缓存。
强缓存
和 协商缓存
。Service Worker, Memory Cache, Disk Cache, Push Cache
。Service Worker
优先级最高到 Push Cache
。先本地再服务器(先强缓存再协商缓存)
header
是否有命中强缓存,若是命中强缓存则直接请求本地的资源,不向服务器发送请求。若是没有命中强缓存或强缓存失效之后就会发送 HTTP
请求服务器,这个过程采用的就是协商缓存
前端
简单的说浏览器的缓存请求分为有无
HTTP
请求两种。
所谓的强缓存是咱们没有发送
HTTP
请求,而是直接从本地缓存中获取资源的一种行为。成功后返回状态码 200。
headers
字段判断 Expires/http1.0
,Cache-Control/http1.1
,来执行强缓存的过程。没有或失效的强缓存,浏览器会向服务器发送请求资源。web
http1.0 中一个页面的缓存字段,是一个格林时间。这个时间是浏览器强缓存资源失效的时间
Expires: Wed, 22 Nov 2021 08:41:00 GMT
上面的表示缓存的资源会在
2021年11月22号8点41分
过时。
HTTP1.1
时 Expires
被放弃了。HTTP1.1 中页面的缓存字段。 若是Expires和Cache-Control
都存在,那么Cache-Control
的优先级更高。
Cache-Control
的属性值有不少,其中属性 max-age
表示,一个相对的缓存时间sql
Cache-Control: max-age = 3600
表示距离上次请求的一小时内能够直接使用本地的缓存。不须要再次请求。
public
表示能够被浏览器或代理服务器缓存。private
表示只能被浏览器缓存。no-cache
须要发送请求到服务器确认是否被缓存,这须要使用到协商缓存。no-store
表示禁止使用缓存,每一次都须要请求服务器。所谓协商缓存是指:浏览器携带缓存的标识 tag
向服务器发送请求,服务器更具携带过来的标识判断是否使用缓存的这个过程就是协商缓存
。
304
表示服务器的资源尚未更新直接使用浏览器本地的缓存便可。另外一种返回 200
,表示服务器资源更新且携带新的资源返回给浏览器。tag
分红两种 Last-Modified/If-Modified-Since
和 ETag/If-None-Match
,Etag / If-None-Match
的优先级高于 Last-Modified
。Etag 时服务器响应请求时 返回的一个惟一标识。这个标识只能由服务器产生。数据库
etag: W/"5357d2b3f63545926812b95658505315"
Etag
标识值发送给服务器,服务器会将这个值和在服务器中的Etag
比较,两个值相等那么返回304
,若是不相等就返回 200
将新的资源返回。Last-Modified,指的是返回请求的资源文件最后在服务器被修改的时间。segmentfault
Last-Modified: Wed, 23 Nov 2021 08:41:00 GMT
Last-Modified
的时间发送给服务器。服务器将上一次最后修改的时间 和如今的最后修改的时间作对比。若是大于If-Modified-Since
的值,服务器就会返回新的资源 200,不然返回 304
。上面提到过缓存的位置Service Worker, Memory Cache, Disk Cache, Push Cache
。Service Worker
优先级最高到Push Cache
HTTPS
。session
中,存活的时间很短。
浏览器的本地缓存主要分为 5 种,
localStorage, sessionStorage, cookie, WebSql, indexedDB
。
cookie 是服务器生成的,保存到浏览器的一个本地文件中。前端能够经过Set-Cookie
设置 cookie,前端能够设置多个Set-Cookie
。
cookie 能够设置过时的时间也能够不设置时间,浏览器关闭后就会失效。浏览器
Set-Cookie: BDSVRTM=7; path=/ Set-Cookie: H_PS_PSSID=34130_34099_33969_31253_33848_33607_26350; path=/; domain=.baidu.com
状态存储
的,由于 http 是无状态的,不能记录数据状态,cookie 能够记录数据的状态。好比用户的id,密码,浏览过的页面等。4kb
大小;2.安全问题,cookie是以文本的形式在浏览器和服务器以前传递信息,颇有可能会被修改。3. 请求的Cookie文件容易被删除。 4. 性能消耗大,cookie 是紧跟域名的,域名下的任意地址被修改都携带cookie到服务器。形成性能浪费。localStorage
存值的方式和 cookie 相似,都会存放在同一个域名下,localStorage 能够长期存储,没有时间的限制。能够经过localStorage.setItem()/getItem()
存取值。
JSON.stringify()
转化。sessionStorage 和 localStorage 一致,惟一大的区别在于 sessionStorage 是会话级别的存储
sessionStorage
也就是在浏览器页面关闭后,这个存储也就消失了。浏览器提供的非关系型数据库,indexedDB 提供大量的接口提供查询功能,还能创建查询。
已废弃,旨在经过 js 语句操控 sql 语句完成对数据的读写。
《图解HTTP》缓存
浏览器缓存安全
前端缓存服务器
本地存储cookie