浏览器跨域
什么是跨域
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制
跨域名访问又分为二级域名跨域、多级域名跨域、以及协议跨域、端口号跨域
小程 序中存在跨域问题吗?由于小程序的宿主环境不是浏览器,而是微信客户端,所以小程序中不存在跨域问题
同源策略
同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。 同源即是同协议、同域名、同端口
不受同源策略限制的:
- 页面中的链接、重定向以及表单提交
- 跨域资源的引入是可以的,但是 js 不能读写加载的内容。如嵌入到页面中的
<script>
,<img>
,<link>
,<iframe>
等
跨域方案
- JSONP
- CORS
- 代理跨域
JSONP
原理:动态创建script
标签,通过script
标签的src
属性调用脚本
1、在服务器端提供 JSONP 支持。服务器需要能够解析传递给它的回调函数名,并将数据包裹在该函数中返回。
- 服务器能处理这种形式的请求:
https://xxx.com/data?callback=getData
- 能返回如下形式的响应:
getData({"name": "zs", "age": 30})
2、创建一个 script 标签去请求数据,并将这个 script 标签添加到页面当中去
// 定义一个处理函数,处理接收回来的数据
function getData(res) {
conlose.log(res);
}
const script = document.createElement('script');
script.src = 'https://xxx.com/data?callback=getData';
document.body.appendChild(script);
jsonp 的优势:
- 使用简单
- 兼容性极好,几乎所有的浏览器都支持 script 标签
jsonp 的劣势:
- 只支持 get 请求
- 存在安全性问题。需要网站双方商议基础 token 的身份验证
- 可能被注入恶意代码,篡改页面内容
CORS
CORS(Cross-Origin Resource Sharing,跨域资源共享)需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于 IE10。
CORS 将请求分成两种:简单请求、非简单请求
简单请求
同时满足以下两个条件就是简单请求
- 请求方法是以下三种方法之一:HEAD、GET、POST
- HTTP 的头信息不超出以下几种字段:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type:只限于三个值
application/x-www-form-urlencoded
、multipart/form-data