Cookie
存在的问题
用户可以随意篡改 Cookie
,Session
可以解决这个问题,防止用户篡改。
Session
与 Cookie
的关系
-
Cookie
- 服务器通过
Set-Cookie
头给客户端一串字符串 - 客户端每次访问相同域名的网页时,必须带上这段字符串
- 客户端要在一段时间内保存这个
Cookie
Cookie
默认在用户关闭页面后就失效,后台代码可以任意设置Cookie
的过期时间- 大小大概在
4kb
以内
- 服务器通过
-
Session
服务器通过
Cookie
给用户一个SessionID
,然后SessionID
对应服务器里的一小块内存,每次用户访问服务器的时候,服务器通过SessionID
去读取对应的Session
,然后知道用户的信息。- 将
SessionID
(随机数)通过Cookie
发给客户端 - 客户端访问服务器时,服务器读取
SessionID
- 服务器有一块内存(哈希表)保存了所有
session
- 通过
SessionID
我们可以得到对应用户的隐私信息,如id
、email
- 这块内存(哈希表)就是服务器上的所有
session
- 将
-
LocalStorage
// 增加了一个数据项目 localStorage.setItem('myCat', 'Tom'); // 读取 localStorage 项 let cat = localStorage.getItem('myCat'); // 移除 localStorage 项 localStorage.removeItem('myCat'); // 移除所有的 localStorage 项 localStorage.clear();
LocalStorage
跟HTTP
无关HTTP
不会带上LocalStorage
的值- 只有相同域名的页面才能互相读取
LocalStorage
(没有同源那么严格) - 每个域名
localStorage
最大存储量为5Mb
左右(每个浏览器不一样) - 常用场景:记录有没有提示过用户(没有用的信息,不能记录密码)
LocalStorage
永久有效,除非用户清理缓存
-
SessionStorage
(会话存储)
1
、2
、3
和4
同LocalStorage
SessionStorage
在用户关闭页面(会话结束)后就失效。
-
Cookie
和Session
是什么关系一般来说,
Session
是基于Cookie
实现的。因为Session
必须将SessionID
放到Cookie
里面,然后再发给客户端,没有这个SessionID
就没有Session
,Session
是依赖于Cookie
的。 -
Cookie
和LocalStorage
的区别Cookie
每次请求的时候都会带给服务器,LocalStorage
的值不会带给服务器。Cookie
的最大储存量为4kb
,而LocalStorage
为5MB
HTTP
缓存(web性能优化)
-
Cache-Control
是什么Cache-Control
可以让浏览器在一段时间内不访问服务器,直接用本地的硬盘或内存作为响应,这样就极快极快,连请求都没有。-
Cache-Control
(设置多久时间内不要再请求相同的URL
)// 客户端可以在HTTP请求中使用的标准 Cache-Control 指令 response.setHeader('Cache-Control', 'max-age=31536000')
-
为什么首页(
html
) 不能设置Cache-Control
因为如果连首页都缓存了,那么用户刷新了就不会问服务器任何问题,这个时候如果代码更新了(页面更新),用户无法获取最新的版本,一般会把首页留作入口,不设置缓存。
-
一般来说的策略是:尽量把一个版本缓存有多长就缓存多长,如果要升级的话,就改一下
URL
,又能缓存很久时间。
-
-
Expires
(指定一个时间/日期 (本地时间), 即在此时候之后,响应过期。)response.setHeader('Expires', 'Wed, 31 Jul 2019 07:28:00 GMT')
-
如果设置了
Cache-Control
响应头,那么Expires
就会被忽略。 -
Expires
和Cache-Control
的区别:Cache-Control
是设置时间长度,而Expires
是设置时间点,如果两个都设置了优先使用Cache-Control
。
-
-
ETag
(用来给文件一个版本号)-
MD5摘要算法:把一个文件变成一个字符串,如果这个文件有任何一个地方改了,他就会变成一个差异很大的字符串。
var md5 = require('js-md5') var fileMD5 = md5(string) response.setHeader('ETag', fileMD5)
这样在响应头就会多了一个
ETag
,它的值就是这个MD5
。这有什么用呢?在页面下次刷新后,请求头里面多了一个If-None-Match
,它把上一次的MD5
放在下一次的If-None-Match
里面,如果这个值和 浏览器里面的MD5
一样,说明不需要下载(304:请求已被允许,但文件未变化。) -
ETag
和Cache-Control
的区别:用
Cache-Control
是直接不请求,ETag
是不下载但是还是要请求(ETag
和If-None-Match
如果匹配就不用下载,如果不匹配则下载)。
-