PS:参考一些博客,整理供自己复习使用~
同源策略
同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。
同源策略限制内容有:
- Cookie、LocalStorage等存储性内容。
- DOM节点。
- AJAX跨域请求的数据。
跨域
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源。
同源策略限制了通过XMLHttpRequest的方式将站点数据发送给跨域的站点。所以就会发生开发中很常见的请求跨域问题。
协议+域名+端口不同就会发生跨域。
解决跨域的方法
- jsonp:动态添加script标签,只支持GET请求。 JSONP是通过script标签加载数据的方式去获取数据当做JS代码来执行。提前在页面上声明一个jsonp回调函数,函数名通过接口传参的方式传给后台,后台解析到函数名后在原始数据上「包裹」这个函数名,发送给前端。
- cors:跨域资源共享
- 浏览器直接发出CORS请求(浏览器自动在请求头信息中添加Origin字段标识请求的来源,服务器根据配置的请求源决定是否返回这次请求)
- 请求源在服务器允许范围内,服务器在响应头中会增加以下几个字段。
//发起请求的请求源或者*,如果要允许浏览器发送 Cookie 则不能设置成*,必须是明确的请求源
Access-Control-Allow-Origin: http://xxx.com
//值只能为 true,表示允许浏览器发送 Cookie 到服务器,需要客户端同时给 AJAX 请求设置 withCredentials = true 属性
//服务器在不需要浏览器发送 Cookie 时直接去掉该字段
Access-Control-Allow-Credentials: true
//CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:
//Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、
//Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8
- 请求源不在服务器允许范围内,服务器会返回一个正常的(不带上述几个字段)的响应。浏览器发现响应头中没有Access-Control-Allow-Origin字段,则在XMLHttpRequest对象的onerror回调函数中捕捉错误
简单请求和非简单请求
「只要同时满足以下两个条件,就属于简单请求:」
- 请求方法:HEAD、GET、POST
- 请求的Header:Accept、Accept-Language、Content-Language、Content-Type(application/x-www-form-urlencoded、multipart/form-data、text/plain)
「不满足以上两个条件,就属于非简单请求:」
非简单请求就是对服务器有特殊要求的请求,比如请求方法为PUT或DELETE,或者Content-Type字段为application/json
非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为“预检”请求,浏览器会先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段,只有得到肯定答复,浏览器才会发出正式的接口请求。
-
代理
正向代理(客户端)
1. 访问原来无法访问的资源,如google 2. 可以做缓存,加速访问资源 3. 对客户端访问授权,上网进行认证 4. 代理可以记录用户访问记录,对外隐藏用户信息反向代理(服务器端)
1. 保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击大型网站 2. 负载均衡,通过反向代理服务器来优化网站的负载 -
postMessage跨域
-
window.name + iframe