当前位置: 代码迷 >> 综合 >> Cookie Session LocalStorage Cache-Control
  详细解决方案

Cookie Session LocalStorage Cache-Control

热度:46   发布时间:2023-09-19 16:10:09.0

Cookie

服务器通过 Set-Cookie 响应头设置 Cookie
浏览器得到 Cookie 之后,每次请求都要带上 Cookie
服务器读取 Cookie 就知道登录用户的信息(email)
问题
我在 Chrome 登录了得到 Cookie,用 Safari 访问,Safari 会带上 Cookie 吗
no
Cookie 存在哪
Windows 存在 C 盘的一个文件里
Cookie会被用户篡改吗?
可以,下节课会讲 Session 来解决这个问题,防止用户篡改
Cookie 有效期吗?
默认有效期20分钟左右,不同浏览器策略不同
后端可以强制设置有效期,具体语法看 MDN
Cookie 遵守同源策略吗?
也有,不过跟 AJAX 的同源策略稍微有些不同。
当请求 qq.com 下的资源时,浏览器会默认带上 qq.com 对应的 Cookie,不会带上 baidu.com 对应的 Cookie
当请求 v.qq.com 下的资源时,浏览器不仅会带上 v.qq.com 的Cookie,还会带上 qq.com 的 Cookie
另外 Cookie 还可以根据路径做限制,请自行了解,这个功能用得比较少。

Cookie 存在的问题
用户可以随意篡改 Cookie

Session 与 Cookie 的关系
一般来说,Session 基于 Cookie 来实现。

Cookie

服务器通过 Set-Cookie 头给客户端一串字符串
客户端每次访问相同域名的网页时,必须带上这段字符串
客户端要在一段时间内保存这个Cookie
Cookie 默认在用户关闭页面后就失效,后台代码可以任意设置 Cookie 的过期时间
大小大概在 4kb 以内

Session(不翻译)

将 SessionID(随机数)通过 Cookie 发给客户端
客户端访问服务器时,服务器读取 SessionID
服务器有一块内存(哈希表)保存了所有 session
通过 SessionID 我们可以得到对应用户的隐私信息,如 id、email
这块内存(哈希表)就是服务器上的所有 session

LocalStorage

setItem
getItem
clear
LocalStorage 跟 HTTP 无关
HTTP 不会带上 LocalStorage 的值
只有相同域名的页面才能互相读取 LocalStorage(没有同源那么严格)
每个域名 localStorage 最大存储量为 5Mb 左右(每个浏览器不一样)
常用场景:记录有没有提示过用户(没有用的信息,不能记录密码)
LocalStorage 永久有效,除非用户清理缓存
SessionStorage(会话存储)

1、2、3、4 同上

SessionStorage 在用户关闭页面(会话结束)后就失效。
Session 可以用 LocalStorage + 查询参数实现
这是超纲内容。

Cache-Control 是什么
缓存多长时间
max-age=30。30s内,静态资源从本地缓存中读取
首页为什么不能设置 Cache-Control?
1.浏览器禁止
2.用户无法在指定时间内获取最新版本
Expire 是什么
多长时间过期
MD5 是什么
ETag 是什么
给文件版本号

	缓存和重用以前获取的资源的能力是优化性能很关键的一个方面
Cache-Control
在想要想要被缓存的文件上设置
response.setHeader('Cache-Control', 'max-age=30')
max-age的值表示多少秒之内浏览器不会再请求这个文件,而会在请求中读取。
一般情况下,如百度,设置为10年,即越长越好。如果要更新,则改变文件的url。
在node.js出现之前,要更新缓存,就会在要更新的文件名后加时间戳或版本号,但这样的不够细致,且乱。
node.js出现之后,用md5来管理(在文件名后加_md5)。webpack可帮忙处理这个事情。
注意,入口文件不能加缓存。聪明的浏览器也不接受入口文件的缓存(防止程序员犯低级错误。。)
ETag
在服务器里设置响应头
let string = fs.readFileSync('./main.js', 'utf8')
let fileMd5 = md5(string);
response.setHeader('ETag', fileMd5)
第二次请求的时候,浏览器会在请求头里设置if-None-Match,并附上这个md5值
那么,只需要比较这个md5值和你文件的md5值是否一样,如果一样,说明文件没有更新,不需要下载
if(request.header['if-None-Match'] === fileMd5){response.statusCode = 304;
}
Cache-Control 与 ETag 的区别
显然,设置ETag浏览器还是会发请求的,而缓存根本就不会发请求。

缓存与 304 的区别
缓存没有请求。
304 有请求,有响应,但是响应没有第四部分。

Cookie 和 Session 的区别
1.Cookie存放在客户端   Session在服务器端。
2.Cookie相对于Session不安全,Session更安全。
3.Session过多时会消耗服务器资源,Cookie不会。
4.Cookie存储的是字符串,Session存储的是对象。
Cookie 和 LocalStorage 的区别
1.Cookie可以跟服务器进行数据传递,LocalStorage 不会。
2.Cookie的有效时间可以设置,在有效时间内一直有效。LocalStorage始终有效,长期保存,除非用户清理缓存。
3.Cookie存储数据不能超4k,LocalStorage 根据浏览器不同存储大小不同,但比Cookie多。
Cache-Control: max-age=1000 缓存 与 ETag 的「缓存」有什么区别?
max-age=1000 缓存:在1000s内从缓存中读取
ETag:相同版本号,从缓存中读取
  相关解决方案