在工作中,大家应该都遇到过ajax跨域问题,浏览器的错误如下:
XMLHttpRequest cannot load 目标地址No \'Access-Control-Allow-Origin\' header is present on the requested resource. Origin \'http://当前页面地址\' is therefore not allowed access.
为什么会出现跨域问题跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
在此说明一下,所谓的同源,指的是域名、协议、端口均相等。举例如下:
调用 (非跨域)
调用 (跨域:域名不一致)
:81/a/b 调用 :82/d/c (跨域:端口不一致)
调用 https://www.abc.com/d/c (跨域:协议不同)
请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。
在一个http请求中,http头部Referer或Origin字段标识了当前域名,Host字段标识了此时请求的域名。
故,如果我们在当前的js页面,通过ajax请求第三方的数据,就会出现浏览器的跨域问题。
解决跨域问题解决跨域问题,有如下三种方式:
1、使用jsonp
2、服务器代理
3、在服务端设置response header中Access-Control-Allow-Origin字段。
使用jsonpjsonp解决跨域问题的原理是,浏览器的script标签是不受同源策略限制的,我们可以在script标签中访问任何域名下的资源文件。利用这一特性,用script标签从服务器中请求数据,同时服务器返回一个带有方法和数据的js代码,请求完成,调用本地的js方法,来完成数据的处理。
前端实现,以Jquery的ajax方法为例: