HTTP的缓存机制
缓存是什么
就是将资源的副本保存到用户的客户端电脑上,等到下一次在使用的时候就不需要再访问服务器了
而是访问本地的资源
- 目的是减少带宽压力
- 缓存的资源是有生命周期的
缓存的优势
- 缓解服务器的资源消耗和隐形压力,提升服务器端大的整体性能
- 减少服务器端资源加载的延迟,进而减少显示某个资源所用的时间
- 减少对带宽的压力,避免网络堵塞问题
- web站点变的更具有响应性
缓存的应用
常见的HTTP缓存只能存储get响应,无法缓存其他的响应
- 检索请求的成功响应:响应状态码为200,表示为成功入HTML文档,图片,或文件的响应
- 不变的重定向:响应状态码为301
- 错误响应:响应状态码为404的一个页面
- 不完全的响应:响应状态码为206,只返回局部的信息
- 除了get请求外,如果匹配到作为一个已被定义的cache键名的响应
私有缓存
- 私有缓存只能用于独立用户。就是只适用于单独用户,浏览器等
- 命令:
Cache-Control:private
共享缓存
- 可以被多个用户使用的
- 命令:
Cache-Control:public
Cache-Control头
HTTP/1.1定义的Cache-Control头用来区分对缓存机制的支持情况,请求头和响应头都支持这个属性。通过不同值来定义缓存策略
- 禁止进行缓存
Cache-Control:no-store
Cache-Control:no-cachr,no-store,must-revalidate
- 强制确认缓存
Cache-Control:no-cache
- 缓存过期机制
Cache-Control:max-age=31536000
- 缓存验证确认
Cache-Control:must-renalidate
会有浏览器兼容性的问题所以提供了Pragmatou
Pragma头
Pragma头是HTTP/1.0标准中定义的一个header属性,请求中包含Pragma的效果跟在头信息中定义“Cache-Control:no-cache”相同
但是HTTP的响应头不支持这个属性,所以他不能拿来完全替代HTTP/1.1中定义的cache-Control头通常定义oragma以向后兼容基于HTTP/1.0的客户端
Prama:no-cache
Expires头
Expires响应头包含日期/时间,即在此之后,响应过期。
- 无效日期,比如0代表着过去的日期,即该资源已经过期
- 如果在Cache-Control响应头设置了"max-age"或者“s-max-age”命令,那么Expires头会被忽略
Expires:Web,21 Oct 2015 07:28:00 GMT
Cookie
什么是Cookie
Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,会在浏览器下一次向同一服务器再发起请求时被携带并发送到服务器上
Cookie解决HTTP协议的无状态问题
Cookie的存储
Cookie保存在客户端某个特定的目录下的一个扩展名为“.txt”文本文件中并且不同的Cookie数据保存不同文件中
Cookie是加密后保存的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m7X9gMw5-1599015347377)(https://s1.ax1x.com/2020/08/19/dQNrY4.png)]
·Cookie的作用域
Domain和Path标识定义了Cookie的作用域,即Cookie应该发送给哪些URL
- Domain标示指定了那些主机可以接受Cookie
- 如果不指定,默认为当前文档的主机(不包含子域名)
- 如果指定了Domain,则一般包含子域名。
- Path标识指定了主机下的哪些路径可以接受Cookie(该URL路径必须存在于请求URL中)。以字符%x2F("/")作为;路径分隔符,子路径也会被匹配。
Cookie的有效期
Max-Age和Expires标识了Cookie的有效期,即Cookie的声明周期
- 会话期
- 会话期Cookie是最简单的Cookie。浏览器关闭之后Cookie会被自动删除,也就是说Cookie仅在会话期内有效会话期Cookie不需要指定过期时间(Expires)或者有效期(Max-Age)。
- 持久性Cookie
- 持久性Cookie可以指定一个特定的过期时间(Expires)或有效期(Max-Age)。
Cookie的应用
Cookie主要用于以下三个方面
- 会话状态管理(如用户登录状态,)
- 个性化设置(如用户自定义设置,主题等)
- 浏览器行为追踪(如跟踪分析用户行为等)
创建Cookie
JavaScript可以使用document.cookie属性来访问和更新cookie.语法如下:
document.cookie=newCookie;
newCookie是一个键值对形式的字符串。需要注意的是,用这个方法只能对一个cookie进行设置或更新
document.cookie=“name="ceshiwenben";
document.cookie="someCookieName=true;expires=Fri,31 Dec 9999 23:59:59 GMT;path=/";
读取Cookie
JavaScript可以使用document.cookie属性来访问和更新Cookie。
语法:
allCookies=document.cookie;
allCookies被赋值为一个字符串,该字符串包含所有的Cookie,每条cookie以分号分隔(即key=value键值对)
删除cookie
JavaScript删除cookie只需要设置Expires标识为以前的时间即可如下:
document.cookie="username=;expires=Thu,01 jan 1970 00:00:00GMT";
http中的cookie
set-cookie响应头
服务器使用set-cookie响应头部向用户代理发送cookie信息
set-cookie:<cookie名>=<cookie值>
cookie请求头
GET/sample_page.html HTTP/1.1
Host:www.example.org
Cookie:yummy_cookie=choco;tasty_cookie=strawberry
跨域资源共享
CORS是什么
新增了一组HTTP首部字段允许服务器声明那些原站有权限访问那些资源
- 应用于三种场景
- 1.简单请求
- 2.预检请求
- 3.认证请求
简单请求是什么
请求满足所有下述条件,则该请求可视为“简单请求”:
- 使用下列请求方法之一:GET,HEAD,POST
- 不得人为设置下列集合之外的其他部首字段:Accept,Accept-Language,Content-Language,Content-Type
- Content-Type的值仅限于下列三者之一
- text/plain
- multipart/form-data
- application/x-www-form-urlencoded
值得注意的是:这些跨域请求与浏览器发出的其他跨域请求并无二致。如果服务器未返回正确的响应部首,则请求方不会收到任何数据。因此那些不允许跨域请求的网站无需为这一新的HTTP访问控制特征担心
请求消息
请求首部字段origin表示该请求来源于http://foo.exmaple,Origin的值是每次发送请求是自带的请求首部消息
响应消息
相应中携带了相应首部字段Access-Control-Allow-Origin,使用Origin和Access-Control-Allow-Origin就能完成最简单的访问控制
预检请求
满足下述任一条件时即应首先发送预检请求
- 使用下列请求方法之一:put,delete,connect,options,trace或path
- 不得人为设置下列集合之外的其他首部字段:Accept,AccePt-Language,Content-Language,Content-Type
- Content——Type的值仅限于下列三者之一
- text/plain
- multipart/form-data
- application/x-www-form-urle
预检请求要求必须首先使用options方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。
预检请求可以避免跨域请求对服务器的用户数据产生未预期的运行
请求消息
以下是options预检请求消息实例
- 请求首部字段Access-Control-Method表示该请求使用post方法
- 请求首部字段Access-Control-Request-headers表示该请求携带X-PINGOTHER首部字段
响应消息
实例:
- 响应首部字段Access-Control-Allow-Methods表示允许post,get,和options请求方法
- 响应首部字段Access-Control-Allow-Headers表示允许请求携带首部字段X-PIMGPTHER
- 响应首部字段Access-Control-Max-Age表示设置响应有效时间为172800秒
什么是认证请求
cors可以基于 HTTP Cookies和HTTP认证信息发送身份认证。一般而言对于跨域XML HttpReqest请求 浏览器不会发送身份信息 如果要发生凭证信息需要设置XML HttpRequest的某个特殊标志部位
xmlHttpRequest.withcredentials=true;
将xmlHttpRequest的withcredentials标志位true使得向服务器发送Cookies服务器返回响应首部字段Access-Control-Allow-Credentials:true
如果服务端的响应中未携带Access-Control-Allow-Credentials:true 浏览器将不会吧响应内容返回给请求的发送者
请求消息
实例:
该请求携带了请求首部字段Cookie的相关信息
响应消息
实例: