浏览器缓存,Cookie和Session

近段时间都是在更新前端学习相关的文章,今天来学习和总结一下一个web通用知识: 浏览器缓存,Cookie和Session。这玩意对前端的性能优化也有一定作用,应该属于前端必须掌握的知识之一了。

缓存

在说这些之前,先说说浏览器的缓存。为什么会出现浏览器的缓存技术?不想下东西呗。同样的东西,我每次请求都要下一次,不管是从用户体验还是速度的方面考虑,都非常的僵硬。于是聪明的前端——哦不,浏览器设计者就想到了增加缓存这个东西。

前端想要自己控制缓存,可以在header上设置cache control(Link至MDN,以下部分内容来自MDN)。不算非标准的拓展命令,可以使用的属性值为以下:

缓存请求指令:

Cache-Control: max-age=<seconds>、max-stale[=<seconds>]、 min-fresh=<seconds>、 no-cache 
、no-store、 no-transform、 only-if-cached

缓存响应指令:

Cache-control: must-revalidate、no-cache、no-store、no-transform、 public、 private、proxy-revalidate、 max-age=<seconds>、 s-maxage=<seconds>

一个个说的话就太麻烦了,还是直接看MDN比较好。这里我画一个简单的思维导图做辅助记忆用。

http://ooibweb9s.bkt.clouddn.com//17-6-19/65594827.jpg

Cache-control
Cache-control

看图细心的话应该能够发现,图中有一个s-maxage,对它的设置会覆盖maxage和Expire。Expire是什么?这就是我们能够在Header中设置的另外一个值。将Expires-cache contrl设置为一个时间,那么只要当前时间没有到这个时间,我们所有对服务器进行的请求都将不被接受转而直接走硬盘。(Expire的解释在MDN上没有中文,我认为应该直接翻译为“过期时间”?)

但是Expire有一个小小的问题,就是这个时间怎么来。要知道,浏览器的取时间方法(比如getTime)都是直接取得系统时间,这样就带来一个问题。根据客户端信息不可靠原则,如果我本地的时间错乱(比如我这种装了双系统然后Linux每次都会莫名改写windows时间的),那么Expire就形同虚设。所以嘛,一般不推荐使用Expire.

我们还能够设置的一个属性则是Last-Modified。如果设置了Last-Modified,那么它将默认保存缓存的内容300S。

Cookie

Cookie是啥我想我就不需要解释了,最简单的Cookie设置方法就是document.cookie/Cookies.set方法。在Set Cookies以后,对相同域名的所有请求都会带上这个Cookie回传。Cookie一般分为两种类型,分别为非持久Cookie(内存Cookie)和持久Cookie(硬盘Cookie)。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,而硬盘Cookie则有一个过期时间,过期时间内是持续有效的。

为什么要有Cookie?

因为HTTP协议是无状态的,服务器无法记录用户上一次的操作,这样就造成了交互上的阻碍。而Cookie就可以做到绕开HTTP的无状态。服务器借由从Cookie中读取包含的信息,借以维护用户和服务器会话中的状态。(比如购物/登录)。

Cookie的路径

Cookie一般都是由于用户访问一个页面才产生的,但是我们会遇到一个问题——并不是只有在创建Cookie的页面才需要访问这个Cookie。如果出于安全考虑,只有与创建Cookie的页面出于同一个目录或在创建Cookie页面的子目录下的网页才可以访问。

那么这样就又会带来一个问题:如果者说我希望其父级乃至整个网页都能够使用Cookie,怎么做呢?

可以这样:

document.cookie="userName=CoderMageFox;path=/";

Cookie的域

路径问题解决了,又一个问题摆在了面前。如果我们在同一个主域下有不同的域名(如img.codermagefox.com和test.codermagefox.com)那么如何互相访问呢?要知道,这个需求的场景相当多。这个时候,我们可以选择指定可访问Cookie的主机名来进行设置。

document.cookie="name=codermagefox;domain=codermagefox.com path=/;"

这样就可以解决啦。

Cookie的缺陷
(以下引用自MDN)
1.Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
2.由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)
3.Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。[3]

然而我在翻阅《JavaScript权威指南》的时候发现了一点,现代浏览器遵循的HTTP标准是RFC2965

书上原文:

而这个标准中对于这一段是这么写的:

5.3  Implementation Limits

   Practical user agent implementations have limits on the number and
   size of cookies that they can store.  In general, user agents' cookie
   support should have no fixed limits.  They should strive to store as
   many frequently-used cookies as possible.  Furthermore, general-use
   user agents SHOULD provide each of the following minimum capabilities
   individually, although not necessarily simultaneously:

      *  at least 300 cookies

      *  at least 4096 bytes per cookie (as measured by the characters
         that comprise the cookie non-terminal in the syntax description
         of the Set-Cookie2 header, and as received in the Set-Cookie2
         header)

      *  at least 20 cookies per unique host or domain name

看到这里我有点懵逼了。不是说at least 吗?所以说这些标准其实是浏览器自己定的而不是文档规定的?这个坑我暂时没弄明白,以后弄明白了再回来填。

Session

正如同上面所说,HTTP的传输有一个很大的问题,就是明文传输。明文传输会导致一个什么问题?我可以抓包来获取很多用户信息(比如使用WireShark\Fiddle等工具)而且HTTP请求是可以篡改的,并且十分容易篡改。又根据客户端信息不可靠原则,我们需要一个东西来验证用户的身份怎么办呢?

这个时候,Session就出马了。Session也可以做到Cookie的部分功能,不过,Session是保存在服务器上的。服务端的信息无法随便篡改,所以Session可以做到可靠。具体的做法一般是服务端和客户端之间不传输明文数据,而是传输一段经过特殊加密的密文,密文对应的服务器硬盘数据中才是真实的数据。这段数据在Session激活后从服务器磁盘中取出到内存中,再返回给浏览器。

需要注意的是,Session是一种抽象的概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”。而而 cookie 是一个实际存在的东西,http 协议中定义在 header 中的字段。Session可以被认为是一种Cookie的后端无状态实现。

当然,现在很多大流量的网站使用的一般是Secret Cookie,这又是另外一种做法了。

便于记忆的思维导图:

写了这么多,对于Cookie/Session的理解算是有一些了。今天收获不错,Nice!

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

推荐阅读更多精彩内容

  • 背景在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称为cookie,cooki...
    时芥蓝阅读 2,353评论 1 17
  • 作者:晚晴幽草轩www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饥人谷_Dylan阅读 1,222评论 0 51
  • 注:本文转载自前端大全 背景 在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称...
    楠小忎阅读 668评论 0 0
  • 看 野 戏 顾 冰 我的小学在江南小镇三河口。...
    牛牛红红阅读 642评论 0 1
  • 今天遇见一个女人 因为都需要排队半小时 结果她就交浅言深的 和我倒了很多话 这突如其来的倾诉 有点像刹不住车的水龙...
    燕子貓貓阅读 190评论 0 0