一、http缓存
http缓存分为两种:强缓存和协商缓存。浏览器发起第二次相同的请求时会先判断能不能使用强缓存,不行的话,再判断能不能使用协商缓存(如果没有设置强缓存,协商缓存也不会生效)。
强缓存
命中时直接读取缓存,不会和服务器进行通信。返回状态码200,Size列为from cache。
由Expires和Cache-control控制的。Expires表示失效时间,当浏览器第一次请求时,服务器response返回Expires。浏览器将其保存,在第二次请求时与请求时间对比,如果在失效时间之前,则直接从缓存中读取数据。
Cache-control,字面理解缓存-控制。可是设置多个值:
max-age:是一个相对时间,表示资源有效期。
no-store:表示禁服务器止使用缓存,每次请求都要访问服务器。
no-cache:强制所有缓存了该响应的用户,在使用已缓存的数据前,发送带验证器的请求到服务器。
private:表示只能被终端用户的浏览器缓存,不允许被代理服务器缓存。
public:表示可以被任何对象缓存。
Expires是在http1.0提出的,所以http1.1d Cache-control优先级高于Expires。
协商缓存
若未命中强缓存,则浏览器会将请求发送至服务器。服务器根据http头信息中的Last-Modify/If-Modify-Since(http1.0)或Etag/If-None-Match(http1.1)来判断是否命中协商缓存。如果命中,则http返回码为304,浏览器从缓存中加载资源。
Last-Modify/If-Modify-Since
第一次请求时返回的Response Headers中用Last-Modified表示请求的资源在服务器上最新的修改时间,第二次请求时在Request Headers中用If-Modified-Since带上这个值发到服务器,服务器对比这个值和这个资源上的最新修改时间决定是否直接返回304还是返回资源。当返回304时,表示资源没有更新,调用了缓存,未访问服务器。
Etag/If-None-Match
第一次请求时返回的Response Headers中返回Etag,是资源的唯一标识符。假设资源发生变化Etag随之变化。第二次请求时Request Headers头带有If-None-Match:‘Etag’,服务器会根据If-None-Match来判断是否命中缓存,若命中则返回304,调用缓存。
总结(流程图)
图片来源:https://www.cnblogs.com/ranyonsue/p/8918908.html
二、Cookie、Session和 localStroage
cookie和session都是为了弥补http协议的无状态特性,对server端来说无法知道两次http请求是否来自同一个用户,利用cookie和session就可以让用户只登录一次,server就知道某个请求是否需用重新登录。
localStorage是HTML5的本地存储功能。
Cookie
cookie保存在浏览器,用来维护用户计算机中的信息,保证长时间不掉线。直到用户删除。
客户端第一次正常访问服务器,服务器在response headers中返回与用户信息相关的cookie,客户端收到后把cookie保存在本地,下次再发请求时会在request headers中带上这个cookie,服务器收到这个cookie就知道用户状态了。cookie可以设置过期时间,默认值是-1,表示关闭浏览器时cookie就会失效,值为0时表示立马失效,相当于删除cookie(cookie没有删除的方法),服务器和客户端都可以设置cookie,但不可以操作另一个域名下的cookie。
Session
session称为会话信息,位于web服务器上,保存用户会话信息。
客户端第一次正常访问服务器,服务器生成一个sessionid来标识用户并保存用户信息(服务器有一个专门的地方来保存所有用户的sessionId),在response headers中作为cookie的一个值返回,客户端收到后把cookie保存在本地,下次再发请求时会在request headers中带上这个sessionId,服务器通过查找这个sessionId就知道用户状态了,并更新sessionId的最后访问时间。sessionId也会可以设置失效时间,比如如果60分钟内某个session都没有被更新,服务器就会删除这个它。
由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。
localStorage
本地存储功能,除非手动删除数据,否则会一直保存。比如,用户首次登陆后保存用户名密码,以便下次直接登录。