准备面试的过程当中看到面经里反复说起这个问题,写一篇博客来记录一下,其中添加了本身的理解,若是有不对还请大佬们赐教html
(该部分引用自https://www.jianshu.com/p/6fc9cea6daa2、http://www.javashuo.com/article/p-ndchkvsk-dv.html、http://www.javashuo.com/article/p-urqfeegv-ec.html)面试
Cookie的产生缘由是HTTP协议无状态,也就是说,下次HTTP请求不知道上一次请求了什么信息。可是例如购物网站等地方,若是咱们把东西添加到购物车时候还在登录状态,而结帐的时候,浏览器“翻脸”了,不记得咱们是谁了,还要从新登录,就会形成麻烦。也所以,咱们须要用一个“容器”存储这些信息,这就有了Cookie,能够把它当作是“缓存”。跨域
Cookie其实是一小段文本信息,当咱们最开始访问网页的时候,服务器端会认证咱们的信息,用response发给客户端一个Cookie,里面记录了用户的状态。下次咱们再访问这个服务器的时候,客户端的浏览器会把这个Cookie连同请求地址一同发给服务端,这样服务端就能够验证出用户的状态。浏览器
因为Cookie记录了用户的状态,这个状态若是不改变(例如一个固定的用户名和密码),实际上只有第一次访问网站的时候须要获取用户状态。这里,cookie的设置以及发送包括如下4步:缓存
①客户端发送一个请求到服务器安全
②服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部服务器
③客户端保存cookie,以后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部cookie
④服务器返回响应数据dom
其中,浏览器提交Cookie给服务端时,只提交name和value,maxAge属性不可被服务端读取,只是客户端用来判断Cookie是否失效网站
过时时间,用maxAge表示,单位为秒,能够用getMaxAge()和setMaxAge(int maxAge)来读写该属性
正数表示在maxAge后失效,期间关闭浏览器/电脑不会致使失效
负数表示临时Cookie,只在浏览器当前窗口(会话)或该窗口打开的子窗口有效,关闭窗口就失效
0表示Cookie当即失效
Cookie是不能够跨域名的,并且通常状况下,同一个一级域名下的两个二级域名也不能交互使用Cookie,若是想的话,须要设置Cookie的domain属性为一整个一级域名
例如mail.qq.com和www.qq.com,设置domain为qq.com便可实现这两个域名访问同一个Cookie
即容许访问Cookie的路径,设置为/时,容许全部路径访问Cookie
修改只能够用一个同名的Cookie来覆盖以前的
删除则用同名的Cookie覆盖,并把maxAge设置为0
这里须要注意,用来覆盖的Cookie必须和以前的Cookie在value和maxAge以外的全部属性一致(name、path(Cookie在当前哪一个路径下生成)、domain(生成Cookie的域名)等),不然不能够实现修改/删除
大小
Cookie大小受到限制,不一样的浏览器下,同一域名的Cookie的个数以及每一个Cookie的长度有限制
cookie会被附加在每一个HTTP请求中,因此无形中增长了流量。
因为在HTTP请求中的cookie是明文传递的,因此安全性成问题。(除非用HTTPS)
Cookie的大小限制在4KB左右。对于复杂的存储需求来讲是不够用的
简单总结就是:请求流量大、不安全、容量小不能知足复杂需求
HTML5的新增特性中,添加了localStorage,字面意思为“本地存储”,其实也就是客户端存储一些信息用的,其产生主要是由于Cookie的容量不足,不过其大小也就5M左右
localStorage存储在浏览器中,不会随着关闭浏览器而消失
(未完待续)