web请求跨域问题

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就是将浏览器关闭同源策略,

扫描二维码关注公众号,回复: 2936834 查看本文章

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设置代理,让浏览器认为你们两个看起来一样。


以上共勉。

猜你喜欢

转载自blog.csdn.net/Suviky/article/details/80681716