跨域解决方式
出于安全方面的考虑,浏览器遵从同源策略的原则。即同协议(http/https)、同域名(jianshu.com/jianshu.book.com)、同端口(jianshu.com/jianshu.com:8080)。不允许非同源的客户端读写对方的文件,但是我们需要从服务器获取数据,而服务器的地址和我们网站的地址不是总是一样的,所以我们需要解决跨域的问题。
跨域的实现形式
常见的跨域解决方式有四种:CORS
、JSONP
、降域
和 postMessage
。
前两种针对网页获取数据的解决方式,后两种主要针对页面内的 iframe 元素的实现方式。
CORS
CORS 的全称为跨域资源共享(Cross-Origin Resource Sharing),是一种 ajax 跨域请求的方式,支持现代浏览器,IE10 以上支持。
CORS 实现跨域的原理是:当页面使用 XMLHttpRequest 发送请求的时候,浏览器会自动检查请求地址是否符合同源策略。当请求不符合同源策略时,浏览器会在请求头中添加一项 Origin ,后台会进行判断。如果确定接受请求,则在响应头中添加一项 Access-Control-Allow-Origin 。浏览器会判断响应头中有没有 Access-Control-Allow-Origin 这一项;如果有,浏览器会处理响应,可以拿到数据;否则将会无法拿到数据。
前端页面及后端页面 请求响应头JSONP
JSONP 是一种相对来说比较 Hack 的方法。HTML 下 script 标签可以引入其他域下的 JS ,
利用这一点,可以实现跨域访问,但是需要后端的接口支持。
这里将 script
标签添加后在删除只是为了美观,不影响页面整体。
实际上是用一个函数将返回的数据 ‘包裹’ 起来,将返回的数据作为参数传入处理函数中。
JSONP(JSON with padding) 是通过 script 标签加载数据的方式来获取数据当作 JS 代码来执行。提前在页面上声明一个函数,函数名通过接口传参的方式传送给后台,后台解析到函数名后在原始数据上 ‘包裹’ 这个函数名,发送给前端。
降域以及 postMessage
这两种方式主要是针对页面内 iframe 元素来进行的跨域实现。
降域
降域—页面代码降域有一个很重要的点就是链接网址的后面部分一定要一样。例如这里的 a.jianshu.com
和 b.jianshu.com
,这里的 jianshu.com
都是相同的。将 document
的 domain
属性设置为相同部分的网址即可实现降域。
postMessage
postMessage 是将页面内的消息作为一个 message 发送给 iframe 内的页面,页面内监听 message
事件,在监听事件内进行操作。这种跨域方式并没有域名的限制,但是不能直接操作 iframe 内的元素,只能收到 iframe 的相应。