pomelovico / keep

A learning notebook
7 stars 0 forks source link

常见浏览器面试问题 #6

Open pomelovico opened 6 years ago

pomelovico commented 6 years ago

[TOC]

CORS

跨域资源共享

浏览器发起异步请求时,如果是跨域操作,会自动携带相应的请求头信息(Origin),所以关键在于服务端实现CORS接口;

浏览器在请求头中携带"Origin"字段

服务器设置:

"Access-Control-Allow-Origin:*"/*允许跨域的域名*/
"Access-Control-Allow-Credentials:true"/*设置只能是true,表示允许浏览器发送cookie,此时Origin必须指定对应的域*/
"Access-Control-Espose-Headers:"/*可以拿到额外的请求头*/

Ajax设置如下可以发送Cookie,默认的异步跨域请求是不会携带cookie

"withCredentials:true"

且只会发送该域下的cookie,其他域的cookie不会发送

浏览器发送预检请求(OPTIONS),用以了解服务端允许使用哪些HTTP动词,请求头等

待服务器允许后才会发送真正的请求

JSONP是利用了<script>标签加载资源不受同源策略影响来实现的,只支持GET请求,原理就是src请求得到的数据会被JavaScript直译器执行,所以服务端要返回类似callback(data)这种数据

浏览器的重绘与重排

回流(reflow):render树的一部分或者全部因为大小边距变化而需要重建的过程叫做回流

重绘(repaint):颜色背景等不引起页面布局变化,仅需要重新渲染的过程。

引起回流的操作:

display:none隐藏了元素,元素不显示,不占据空间,改变了DOM结构,所以会产生回流以及重绘

visibility:hidden使元素不可见,但是保留了元素的空间,没有改变DOM结构,所以只产生了重绘

https://kb.cnblogs.com/page/169820/ https://www.cnblogs.com/dll-ft/p/5810639.html

websocket,长轮询和短轮询

websocket是HTML5中提出的一个协议,HTML5提供了一整套支持websocket的API供使用。

相对于无状态的HTTP协议来说,websocket实现了持久化的链接,websocket借助HTTP完成了部分的握手链接,浏览器会向服务端发起连接请求告诉服务端当前客户端需要一个支持socket连接的服务器来提供服务。连接建立后,客户端不需要定时向服务端发起轮询请求,服务端可以直接推送数据到客户端。

相比于传统的长轮询,ajax轮询来说,websocket减少了每次发起请求时建立连接的资源消耗,减少了服务端的压力。

另外,HTTP中的keep-alive机制是将多个请求合并成一个(一个请求结束后不会关闭请求,下一个请求会继续使用该次建立好的连接),并不是长轮询。

Cookie,LocalStorage与SessionStorage的区别

浏览器事件代理的原理

在非IE浏览器中,事件的触发经过三个阶段:事件捕获,事件对象,事件冒泡。IE8及一下环境中没有事件捕获阶段。

所谓事件代理指的是,利用事件捕获或者事件冒泡阶段,将一些经常动态增减的元素的事件绑定在父元素上面,在父元素上绑定的事件触发时,通过事件回调函数中给出的事件对象event.target来判断是否为我们真正需要绑定事件的子元素,从而做出相应的处理。这种方式可以减少内存泄漏的风险,因为为元素频繁的绑定事件会耗费大量的内存。

https://www.cnblogs.com/diver-blogs/p/5649270.html

https://www.cnblogs.com/dfyg-xiaoxiao/articles/6213063.html

XSS,CSRF,避免方法

跨站脚本攻击(Cross Site Scripting),缩写为XSS

恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

避免方法:对用户提交的内容进行HTML Entity编码转换,或者过滤一些script,iframe(广告多用)节点

CSRF跨站点请求伪造(Cross—Site Request Forgery

冒充用户在站内的正常操作,让用户在本机(拥有cookie的浏览器)发起用户不知情的请求。

CSRF攻击者并不能获取cookie,解析服务器返回的内容(同源策略限制),能做的就是向攻击的服务器发起请求(以受害者的身份)以更改数据,并不能窃取数据

攻击方式:

防御策略:

http://blog.csdn.net/stpeace/article/details/53512283 http://www.vuln.cn/7134

HTTP缓存机制

彻底弄懂HTTP缓存机制及原理

三大缓存方式:

Cache-Control & Expires

Expires值是一个绝对时间,告诉浏览器该文档在该时间之前有效,但是由于浏览器时间和服务器时间可能不一致,所以会导致缓存永久失效或永久有效的问题,不推荐使用,在同时存在ExpiresCache-Control的情况下,后者优先。

Cache-Control在响应首部和请求首部都会出现。在响应首部出现则说明服务器再告诉浏览器该文档的缓存相对时间。若是出现在请求首部,则会被浏览器处理该请求时截获,浏览器根据Cache-Control的值来判断是否读取本地缓存。Cache-Control其有以下几种值:

Pragma:no-cache也可以用户缓存控制,仅用于HTTP请求,兼容HTTP/1.0

Last-Modified & If-Modified-Since:< cached last-modified date>

当缓存对已缓存的文档进行再验证的时候,请求头部就会包含一个If-Modified-Since字段,该字段就是该来自缓存文档响应头部的Last-Modified值,是有服务器给出的文档最后修改的日期,若此期间文档做了修改,则服务器会发送新的文档,否则返回304 Not Modified响应,但不会返回文档主体(减少了传输数据量)

但是这个时间是秒级的,在秒级以内的时间内对文档做了修改后,则不能正确的判断文档是否修改过

Etag & If-None-Match:

服务器可以根据HTTP请求中的If-None-Match字段来比较文档是否有做过修改,该字段携带的是缓存文档响应首部中的Etag字段的值,作为该文档的版本标识符,Etag可以是任意的文档的序列号、版本号、或者文档内容校验等信息。

如果服务器将请求首部的If-None-Match字段与文档的Etag匹配成功,说明文档没有做修改,会直接返回304 Not Modified响应,验证成功。否则会返回200响应,并携带一个新的Etag

Apache开启HTTP缓存

怎么解决跨域问题,有哪些方法

HTTP 和 HTTPS 有何差异? 听说过 SPDY 么?

HTTP2.0

HTTP2.0是基于谷歌提出的SPDY协议改进提出的,旨在解决HTTP1.1的性能问题

http://www.alloyteam.com/2015/03/http2-0-di-qi-miao-ri-chang/

HTTP状态码

php可以通过header()方法设置不同的状态码和状态短语,如:

<?php

header('HTTP/1.1 401 Unauthorized');
header('HTTP/1.1 403 Forbidden');
header('HTTP/1.1 404 Not Found');

TCP/IP 握手连接与挥手断开连接

DDos攻击

HTTP连接

Web Worker

Web Worker实现了在浏览器后台线程中运行javascript脚本的能力,在该后台线程中运行脚本不会阻塞主线程,所以可以把计算量大或者费时的操作放到worker线程中运行,worker与主线程之间通过消息传递的方式进行双向通信

API:

两类worker:

subworker:在worker内还可以创建新的worker,使用importScript()方法引入,该方法是同步

worker线程中可使用大多数JavaScript特性如:

不能访问window下的属性,也不能访问DOM

一个专用worker仅仅能被首次生成它的脚本使用,而共享worker可以同时被多个脚本使用。

workers和主线程间的数据传递通过这样的消息机制进行——双方都使用postMessage()方法发送各自的消息,使用onmessage事件处理函数来响应消息(消息被包含在Message事件的data属性中)。这个过程中数据并不是被共享而是被复制