本系列最开始是为了本身面试准备的.后来发现整理愈来愈多,差很少有十二万字符,最后决定仍是分享出来给你们.css
为了分享整理出来,花费了本身大量的时间,起码是只本身用的三倍时间.若是喜欢的话,欢迎收藏,关注我!谢谢!html
前端面试查漏补缺--Index篇(12万字符合集) 包含目前已写好的系列其余十几篇文章.后续新增值文章不会再在每篇添加连接,强烈建议议点赞,关注合集篇!!!!,谢谢!~前端
后续还会继续添加设计模式,前端工程化,项目流程,部署,闭环,vue常考知识点 等内容.若是以为内容不错的话欢迎收藏,关注我!谢谢!vue
目前本人也在准备跳槽,但愿各位大佬和HR小姐姐能够内推一份靠谱的武汉 前端岗位!邮箱:bupabuku@foxmail.com.谢谢啦!~web
做用面试
cookie是纯文本,没有可执行代码。存储数据,当用户访问了某个网站(网页)的时候,咱们就能够经过cookie来向访问者电脑上存储数据,或者某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(一般通过加密)ajax
如何工做
当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request header中的cookie字段中。这些是浏览器自动帮咱们作的,并且每一次http请求浏览器都会自动帮咱们作。这个特色很重要,由于这关系到“什么样的数据适合存储在cookie中”。算法
存储在cookie中的数据,每次都会被浏览器自动放在http请求中,若是这些数据并非每一个请求都须要发给服务端的数据,浏览器这设置自动处理无疑增长了网络开销;但若是这些数据是每一个请求都须要发给服务端的数据(好比身份认证信息),浏览器这设置自动处理就大大免去了重复添加操做。因此对于那种设置“每次请求都要携带的信息(最典型的就是身份认证信息)”就特别适合放在cookie中,其余类型的数据就不适合了。segmentfault
特征设计模式
Cookie主要用于如下三个方面:
设置
document.cookie = '名字=值';
document.cookie = 'username=cfangxu; domain=baike.baidu.com' //而且设置了生效域
//在设置这些属性时,属性之间由一个分号和一个空格隔开。
//当咱们须要设置多个cookie时
document.cookie = "name=Jonh";
document.cookie = "age=12";
document.cookie = "class=111";
复制代码
注意: 客户端能够设置cookie下列选项:expires(过时时间)、domain(服务器域名)、path(域名下的哪些路径能够接受Cookie)、secure(有条件:只有在https协议的网页中,客户端设置secure类型的 cookie 才能成功),但没法设置HttpOnly选项。
无论你是请求一个资源文件(如 html/js/css/图片),仍是发送一个ajax请求,服务端都会返回response。而response header中有一项叫set-cookie,是服务端专门用来设置cookie的。
Set-Cookie //消息头是一个字符串,其格式以下(中括号中的部分是可选的):
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
复制代码
注意:一个set-Cookie字段只能设置一个cookie,当你要想设置多个 cookie,须要添加一样多的set-Cookie字段。 服务端能够设置cookie 的全部选项:expires、domain、path、secure、HttpOnly 经过 Set-Cookie 指定的这些可选项只会在浏览器端使用,而不会被发送至服务器端。
读取
咱们经过document.cookie来获取当前网站下的cookie的时候,获得的字符串形式的值,它包含了当前网站下全部的cookie(为避免跨域脚本(xss)攻击,这个方法只能获取非 HttpOnly 类型的cookie)。它会把全部的cookie经过一个分号+空格的形式串联起来,例如username=chenfangxu; job=coding
修改 cookie
要想修改一个cookie,只须要从新赋值就行,旧的值会被新的值覆盖。 但要注意一点,在设置新cookie时,path/domain这几个选项必定要旧cookie 保持同样。不然不会修改旧值,而是添加了一个新的 cookie。
删除 把要删除的cookie的过时时间设置成已过去的时间,path/domain/这几个选项必定要旧cookie 保持同样。
注意
cookie
虽然是个字符串,但这个字符串中逗号、分号、空格
被当作了特殊符号。因此当cookie的 key 和 value 中含有这3个特殊字符时,须要对其进行额外编码,通常会用escape
进行编码,读取时用unescape
进行解码;固然也能够用encodeURIComponent/decodeURIComponent
或者encodeURI/decodeURI
(三者的区别能够参考这篇文章)。
何时 cookie 会被覆盖:name/domain/path 这3个字段都相同的时候;
expires
选项用来设置“cookie 什么时间内有效”。**expires
实际上是cookie
失效日期**,expires
必须是 GMT
格式的时间(能够经过 new Date().toGMTString()
或者new Date().toUTCString()
来得到 )。
如expires=Thu, 25 Feb 2016 04:18:00 GMT
表示cookie
讲在2016年2月25日4:18分以后失效,对于失效的cookie
浏览器会清空。若是没有设置该选项,则默认有效期为session
,即会话cookie
。这种cookie
在浏览器关闭后就没有了。
expires
是 http/1.0协议中的选项,在新的http/1.1协议中expires
已经由max-age
选项代替,二者的做用都是限制cookie 的有效时间。expires
的值是一个时间点(cookie失效时刻= expires
),而max-age
的值是一个以秒
为单位时间段(cookie失效时刻= 建立时刻+ max-age
)。 另外,max-age
的默认值是-1
(即有效期为session
);若max-age
有三种可能值:负数、0、正数。负数:有效期session
;0
:删除cookie
;正数:有效期为建立时刻+ max-age
domain
是域名,path
是路径,二者加起来就构成了 URL,domain
和path
一块儿来限制 cookie 能被哪些 URL 访问。
一句话归纳:某cookie的 domain
为“baidu.com”, path
为“/ ”,若请求的URL(URL 能够是js/html/img/css资源请求,但不包括 XHR 请求)的域名是“baidu.com”或其子域如“api.baidu.com”、“dev.api.baidu.com”,且 URL 的路径是“/ ”或子路径“/home”、“/home/login”,则浏览器会将此 cookie 添加到该请求的 cookie 头部中。
因此domain
和path
2个选项共同决定了cookie
什么时候被浏览器自动添加到请求头部中发送出去。若是没有设置这两个选项,则会使用默认值。domain
的默认值为设置该cookie
的网页所在的域名,path
默认值为设置该cookie
的网页所在的目录。
一般 cookie 信息都是使用HTTP链接传递数据,这种传递方式很容易被查看,因此 cookie 存储的信息容易被窃取。假如 cookie 中所传递的内容比较重要,那么就要求使用加密的数据传输。
secure选项用来设置cookie只在确保安全的请求中才会发送。当请求是HTTPS或者其余安全协议时,包含 secure 选项的 cookie 才能被发送至服务器。
document.cookie = "username=cfangxu; secure"
把cookie设置为secure,只保证 cookie 与服务器之间的数据传输过程加密,而保存在本地的 cookie文件并不加密。就算设置了secure 属性也并不表明他人不能看到你机器本地保存的 cookie 信息。 机密且敏感的信息毫不应该在 cookie 中存储或传输,由于 cookie 的整个机制本来都是不安全的
注意:若是想在客户端即网页中经过 js 去设置secure类型的 cookie,必须保证网页是https协议的。在http协议的网页中是没法设置secure类型cookie的。
这个选项用来设置cookie是否能经过 js 去访问。默认状况下,cookie不会带httpOnly选项(即为空),因此默认状况下,客户端是能够经过js代码去访问(包括读取、修改、删除等)这个cookie的。当cookie带httpOnly选项时,客户端则没法经过js代码去访问(包括读取、修改、删除等)这个cookie。
在客户端是不能经过js代码去设置一个httpOnly类型的cookie的,这种类型的cookie只能经过服务端来设置。
——httpOnly
与安全
从上面介绍中,你们是否会有这样的疑问:为何咱们要限制客户端去访问cookie
?其实这样作是为了保障安全。
试想:若是任何 cookie 都能被客户端经过document.cookie
获取会发生什么可怕的事情。当咱们的网页遭受了 XSS 攻击,有一段恶意的script
脚本插到了网页中。这段script
脚本作的事情是:经过document.cookie
读取了用户身份验证相关的 cookie,并将这些 cookie 发送到了攻击者的服务器。攻击者垂手可得就拿到了用户身份验证信息,因而就能够摇摇大摆地冒充此用户访问你的服务器了(由于攻击者有合法的用户身份验证信息,因此会经过你服务器的验证)。
一般cookie的域和浏览器地址的域匹配,这被称为第一方cookie。那么第三方cookie就是cookie的域和地址栏中的域不匹配,这种cookie一般被用在第三方广告网站。为了跟踪用户的浏览记录,而且根据收集的用户的浏览习惯,给用户推送相关的广告。 关于第三方cookie和cookie的安全问题能够查看这篇文章
cookie推荐资源
HTML5新方法,仅IE8及以上浏览器兼容。
特色:
设置
localStorage.setItem('username','cfangxu');
获取
localStorage.getItem('username')
也能够获取键名 localStorage.key(0) #获取第一个键名
删除
localStorage.removeItem('username')
也能够一次性清除全部存储 localStorage.clear()
storage事件
当storage发生改变的时候触发。
注意: 当前页面对storage的操做会触发其余页面的storage事件 事件的回调函数中有一个参数event,是一个StorageEvent对象,提供了一些实用的属性,以下表:
Property | Type | Description |
---|---|---|
key | String | The named key that was added, removed, or moddified |
oldValue | Any | The previous value(now overwritten), or null if a new item was added |
newValue | Any | The new value, or null if an item was added |
url/uri | String | The page that called the method that triggered this change |
补充:
js跨页面触发事件,利用storage监听事件 触发storage事件的条件:
其实跟localStorage差很少,也是本地存储,会话本地存储
特色
localStorage只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改到同一份localStorage数据。
sessionStorage比localStorage更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下。
localStorage是永久存储,除非手动删除。
sessionStorage当会话结束(当前页面关闭的时候,自动销毁)
cookie的数据会在每一次发送http请求的时候,同时发送给服务器而localStorage、sessionStorage不会。
这些不经常使用的前端存储我就不在这里多述了(其实就是我不会=.=).想详细了解的能够查看这篇文章