神经病啊!各种缓存Cookie&Session&Cache-Control

还是想重新学一遍,可能是最后一遍整理了。:D

—————————————————————————————————

一.Cookie

二.Session

三.LocalStorage

四.Cache-Control 缓存

五.Expires 缓存

六.Etag

七.面试题

—————————————————————————————————

一.Cookie

在html5 的localStorage和sessionStorage提出之前 借用cookie做存储, 他本质上是http中的一部门作为客户端和服务器端的通讯

特点

1.服务器通过 Set-Cookie 响应头设置 Cookie
2.浏览器得到 Cookie 之后,每次请求都要带上 Cookie
3.服务器读取 Cookie 就知道登录用户的信息(email)

问题

1.我在 Chrome 登录了得到 Cookie,用 Safari 访问,Safari 会带上 Cookie 吗
no
2.Cookie 存在哪
Windows 存在 C 盘的一个文件里
3.Cookie会被用户篡改吗?

可以,下面会讲 Session 来解决这个问题,防止用户篡改

4.Cookie 有效期吗?
默认有效期20分钟左右,不同浏览器策略不同
后端可以强制设置有效期,具体语法看 MDN
5.Cookie 遵守同源策略吗?
也有,不过跟 AJAX 的同源策略稍微有些不同。
当请求 qq.com 下的资源时,浏览器会默认带上 qq.com 对应的 Cookie,不会带上 baidu.com 对应的 Cookie
当请求 v.qq.com 下的资源时,浏览器不仅会带上 v.qq.com 的Cookie,还会带上 qq.com 的 Cookie
另外 Cookie 还可以根据路径做限制,请自行了解,这个功能用得比较少。
6.前端永远不要写cookie,写localStorage就好!!
7.cookie的缺点:每次访问服务器会带上cookie,如果cookie比较大的时候会影响速度。请求时需要发送到服务端 ,增加请求数据量。只能用document.cookie = '...'来修改,太过简陋。 而且cookie有大小限制等。如果要持久化存储要选择localStorage。

代码部分 后端
if(found){
        response.setHeader('Set-Cookie', `sign_in_email=${email}`)
        response.statusCode = 200
      }
简单概括
  1. 服务器端(http 响应)通过 Set-Cookie 头给客户端一串字符串
  2. 浏览器访问指定域名是必须带上 Cookie 作为 Request Header
  3. Cookie 一般用来记录用户信息
  4. 客户端要在一段时间内保存这个Cookie
  5. Cookie 默认在用户关闭页面后就失效,后台代码可以任意设置 Cookie 的过期时间
  6. 大小大概在 4kb 以内
    ——————————————————————————————————————————

二.Session

一般来说,Session 基于 Cookie 来实现。

简单概括

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

代码部分
if(found){
  let sessionId = Math.random() * 100000
  sessions[sessionId] = {sign_in_email: email}
}
  response.setHeader('Set-Cookie': 'sessionId = ${sessionId}')

——————————————————————————————————————————

三.LocalStorage&SessionStorage

通常用LocalStorage多于SessionStorage

LocalStorage的作用

记录些没有用的信息,比如是否提示过用户,是最近几年新出的。

特点

1.只能存储字符串
2.如果想存对象必须变为json格式的

localStorage.setItem('jsonString',JSON.stringify({name:'obj'}))
简单概括

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

SessionStorage(会话存储)

1、2、3、4 同上
不同点:SessionStorage 在用户关闭页面(会话结束)后就失效。

常用API
LocalStorage
1.localStorage.setItem('mycat','tom')  //存值
2.let cat = localStorage.getItem('myCat')  //取值
3.localStorage.removeItem('myCat')   //移除某一个
4.localStorage.clear();  //移除所有
SessionStorage
1.sessionStorage.setItem('mycat','tom')  //存值
2.let cat = sessionStorage.getItem('myCat')  //取值
3.sessionStorage.removeItem('myCat')   //移除某一个
4.sessionStorage.clear();  //移除所有
具体使用
    var already = localStorage.getItem('已经提示了')
    if(!already){
        alert('你好,这是我们的新功能:___')
        localStorage.setItem('已经提示了',true)
    }else{

    }

——————————————————————————————————————————

四.Cache-control 缓存

简单概括

1.cache-control 可以让浏览器在相同的url下在一定时间内不访问服务器,而是直接用本地内存或硬盘作为响应,这样会让访问速度非常快,连请求都没有。
2.如果要更新的话在入口处即HTML中把url稍微变一变(如:main.css?v=123之类的随便加个参数),这样浏览器就不会使用缓存,他就会下载最新版,再把最新版放到缓存,如果又过时了就再换一下url
3.一般设置cache-control为一年或者更多
4.主页面不能使用cache-control

代码部分
response.setHeader('Cahe-Control','max-age=30')

——————————————————————————————————————————

五.Expires 缓存

与cache-control区别

cache-control是设置多久过期
Expires是设置什么时间过期

摘要

1.Cache-Control是新出的,早在十几年前缓存控制都是用Expires
2.现在基本使用Cache-Control,因为Expires设置的过期时间是指本地时间,比如一个人的电脑时间是错乱的那就完了,所以不靠谱。
3.优先使用Cache-control 他是新版的

代码部分
response.setHeader('Expires','Sun,04 Feb 2018 14:40:25 GM')

——————————————————————————————————————————

六.ETag

ETag是干啥的

他的作用和Cache-Control一样都是控制缓存的,判断要请求的文件是否有变动,如果没有变动则不响应内容,如果 有变动则重新返回内容

md5介绍

1.md5是一个摘要算法不是加密算法
2.为什么说是摘要算法,它把一个文件转为字符串,这个文件中只要有任何一个地方改了,它就会有差异很大的字符串。特点是:如果内容差异越小,则字符串的差异越大,如果内容差异越大,字符串差异越小。即把微小的差异变大。

md5使用
image.png
ETag用法

在服务器端把要响应的文件进行md5转换为字符串作为响应头给客户端


image.png

当客户端第二次请求的时候会多一个请求头 If-None-Match


image.png
ETag简单介绍

1.服务器端将要返回客户端的文件进行md5转换,作为响应头传给客户端(ETag:xxxxxx)。
2.客户端会记录下ETag的内容,并作为请求头传给服务器端(If-None-Match:xxxxxx)
3.服务器端会判断ETag和If-None-Match的md5转换码的内容是否一样,如果一样说明文件没变化就不返回给客户端新的内容了,如果有一点点不同就会返回给客户端新的内容,以此达到缓存优化的目的。

代码部分
let string = fs.readFileSync('./js/main.js','utf8')
let fileMd5 = md5(string)
response.setHeader('ETag',fileMd5)
if(request.headers[if-none-match] === fileMd5){
  response.statusCode = 304  //没有变化 没有响应体 
}else{
  response.write(string)  //有响应体
}
与Cache-Control区别:

Cache-Control是设置时间长度,在这个时间长度内不会再向服务器发送http请求。
ETag是一直发送http请求,然后判断加载的文件是否有变化,如果变化则返回新的文件。
所以一般来说要用Cache-Control 因为它压根不发送请求了,响应速度更快了一些,而ETag还要发送请求。

——————————————————————————————————————
大致分类


image.png

面试题:

1.Cookie 和 Session 的区别

Cookie 保存在客户端,每次都随请求发送给 Server
Session 保存在 Server 的内存里,其 Session ID 是通过 Cookie 发送给客户端的

2.Cookie 和 LocalStorage 的区别

1.cookie默认有效期是在用户关闭页面就失效,但是后台代码可以任意设置cookie的过期时间。cookie每次发起请求的时候都会带给服务器。
2.localStorage与HTTP无关不会带给服务器。
3.一般来说cookie有4K,而localStorage有5M

3.LocalStorage 和 SessionStorage 的区别

sessionstorage在用户关闭页面(session结束)后就失效。
而localStorage是永久生效的。

4.如何删除 Cookie?

chrome浏览器:工具-高级-隐私设置和安全性-清除浏览数据

5.Cache-Control: max-age=1000 缓存 与 ETag 的「缓存」有什么区别?

Cache-Control:缓存时间为1000秒 也就是在1000秒内不请求
Etag:如果MD5一样,尽管请求,但不下载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容