RPC/SOA中非常常见的问题,
那么它是什么呢?
本质上是Client的Browser的一种保护机制,客户端像服务器A发送了一个请求,服务器A告诉了服务器B由服务器B返回了一个数据,浏览器校验到两个url不同就会这样↓
200却报错= =!
如何引起的呢?
1这个请求是xhr请求
2这个请求跨域了
怎样会跨域?
端口,域名,协议只要有一个不同都算跨域。ps:有一点要注意localhost和127.0.0.1在不同服务器上指代不同不要觉得他们写的一样就觉得没问题了,不然你会陷入一个看不见的坑 = =!
举例
url = http://222.107.45.17:8080
url1 = http://222.107.45.17:8081
url2 = http://222.107.45.18:8080
url3 = https://222.107.45.17:8080
url和url1,url2,url3对比都算跨域。
3浏览器开启了同源策略
以上三个情况同时发生才会发生跨域问题
解决方案
既然发生条件是三种,那解决方案也是从这三点入手,针对3就是将浏览器关闭同源策略,
chrome的话可以通过在命令行,输入
chrome.exe --allow-file-access-from-files --user-data-dir="C:/Chrome dev session" --disable-web-security
但是这个点你无法控制,因为一般来说你的客户浏览器为了安全性都是开启了同源策略的。
针对1就是jsonp的方式了,本质是将xhr请求方式改变了,浏览器会将返回的值当做js来解析。
嘛,,,这样其实也有弊端,毕竟xhr请求的一些特性你都不能用了。
针对2就是在请求本身身上做文章,拿上面的例子来讲,图中说明已经很清楚了,CORS头缺少'Access-Control-Allow-Origin'。在服务器B返回数据的时候设置这个请求头就可以了,这个请求头的意思就是告诉浏览器服务器B允许A调用服务,我们返回的数据是安全的。当然也有可能服务器B是你调用的接口,你操作不了人家的代码,这样的话只能给A设置代理,让浏览器认为你们两个看起来一样。
以上共勉。