#浏览器缓存机制#
cookie
- 服务器收到请求后,会设置Set-cookie响应头,浏览器收到后就会将其存到本地,可设置失效时间,类似
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
,其中Secure - 存放数据大小为4K左右
cookie
会伴随客户端请求发送到服务器,每次都会携带在HTTP请求报头中,保存数据过多会带来性能问题,尤其是移动环境
cookie
操作
设置cookie
document.cookie='name'+name+';expires='+(new Date()+100000)+';path='+path
读取cookie
var cookie = document.cookie
解析cookie
'{"'+document.cookie.replace(/;\s*/gim,'","').replace(/=/gim,'":"')+'"}';
清除cookie
document.cookie='name'+name+';expires='+new Date()+';path='+path
cookie新属性
Same-site
- Lax: 默认,会被自动发送给服务器
- Strict:只有请求和当前请求URL完全一致时才发送
- None:同站请求和跨站请求都会发送cookie
localStorage
##
- 除非被清除,负责永久保存
localstorage
安全性分析
- 除
Opera
会将localStorage
用base64
编码外,其他浏览器直接明文存储 localStorage
永久存储除非手动删除,不像cookie
那样可以设置生存期localStorage
无法抵抗XSS
攻击,而cookie
有httponly
localStorage
在同一个域下是共享的,因此任意路径下受到攻击的话,所有路径都会被牵连localStorage 5M
大的存储空间极有可能为恶意代码提供栖息地
sessionStorage
##
- 在浏览器关闭后失效
localStorage和sessionStorage一般为5M,仅在浏览器端保存,不参与通信
cookie,localStorage,sessionStorage
权限
-
cookie
是doccument
的方法,而localStorage,sessionStorage
是window
方法。 -
同域名下(协议,端口,主机号)
localStorage
可访问,不管路径。 -
从当前页面跳转到同域名下的其他页面时
sessionStorage
才可访问,若直接打开同域名子路径下或同路径下的的页面时,sessionStorage
不能访问,除非跳转到上一级路径对应的页面后再跳回来才可以访问。 -
同域名同级路径下的
cookie
可访问,同域名子路径下的cookie
不能访问,但子路路径可访问父路径下的cookie
。
H5 AppCache
##
应用程序缓存,以下优势
- 离线浏览
- 已缓存资源加载更快
- 除了IE,其他浏览器都支持
应用
添加demo.manifest文件,内容为:
- CACHE MANIFEST 此标题下的文件首次下载后缓存
- NETWORK 此标题下不会缓存
- FAILBACK 不能访问页面时应展现的内容
- 例如:
FAILBACK:
/html5/ offline.html
表示用offline.html
替换请求``/html5/`文件下所有请求出错的页面。
设置html标签
<html manifest="demo.manifest">
</html>
注意:manifest文件需要在服务器上正确的配置MIME-type,即text/cache-manifest
与缓存相关的http头##
Pragma
- Pragma是http1.0中的
- 只有IE能识别,IE虽能识别此meta标签,并不一定会在请求头中加入
Cache-Control:no-cache
,但的确每次都会发送请求 - 通过设置meta标签
<meta http-equiv="Pragma" content="no-cache">
- 其他主流浏览器只能识别
<meta http-equiv="Pragma" content="no-store">
Expires
- expires告诉浏览器副本在缓存截止时间前是可用的(绝对时间间隔)
- expires是http1.0中的
缺点
- 到期时间是服务器时间,可能存在误差,
- 可设置expires=max-age+每次下载时的当前request时间
- 可用meta标签
<meta http-equiv="expires" content="mon, 18 apr 2016 14:30:00 GMT">
可将content
设为0或者-1即不缓存 - Pragma 优先级高于expires
Cache-Control
- http1.1版本
- max-age:单位(s)
- 若和expires,Pragma 同时存在,cache-control优先
- 可用meta标签
<meta http-equiv="cache-control" content="max-age:2900">
以上字段决定是否发送请求,若设置的时间未过期,则不发送请求。直接走缓存,chrome下显示200 from disk cache
若以上字段设置的时间过期,而服务器上的资源并未更新,则使用以下字段
Last-Modified和If-Modified-Since
- http1.1版本
- 响应头:Last-Modified
- 请求头:If-Modified-Since
- 若Last-Modified时间早于If-Modified-Since时间,则返回http304,内容为空
- 若If-Modified-Since时间比当前请求时间还晚,则认为是非法请求
- 时间由服务器自动生成
- 不识别毫秒级的时间
- 优先级高于Etag
Etag和If-None-Match
- http1.1版本,是Last-Modified的补充
- Etag是服务器发送给客户端的请求标记,通过响应头传递
- If-None-Match是请求头的信息,查看是否和Etag匹配,若匹配,返回304
- 比last-modified精确,在服务器端通过取文件的hashCode或者MD5算法生成,运算量大。