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同LocalStorageSessionStorage在用户关闭页面(会话结束)后就失效。
-
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如果匹配就不用下载,如果不匹配则下载)。
-