断断续续看这个问题好几天了,以下做一下简单总结。
问题描述
浏览器有同源限制(即协议、域名、端口相同
),如果页面A想要访问另外一个非同源页面B(不清楚怎么描述,理解为一个URL
)提供的WebAPI,则浏览器是不允许的。
问题本质
跨域并非浏览器限制了发起跨站请求
,而是跨站请求可以正常发起,但是返回结果被浏览器拦截了
。最好的例子是CSRF跨站攻击原理,请求是发送到了后端服务器无论是否跨域!注意:有些浏览器不允许从HTTPS的域跨域访问HTTP
,比如Chrome和Firefox,这些浏览器在请求还未发出的时候就会拦截请求,这是一个特例。这本质是浏览器实现的问题
。
解决方案
-
JSONP方式
服务器端
将数据以jsonp方式包裹起来,再在浏览器端以jsonp方式访问。 -
Access-Control-Allow-Origin
方式
服务器端
返回的数据Header中添加Access-Control-Allow-Origin
控制为*
,则可以供非同源网页访问。
[注]这两种方式都需要服务器端配合,没法只在浏览器端修改来实现。
网友评论