ajax跨域解决方案
先看看域名组成:
http:// | www.baidu.com | :80 | /abc/123 | ?id=12 |
【协议】 | 【地址】 | 【端口】 | 【文件】 | 【参数】 |
我们再来看看何时才算跨域:
当协议或者地址或者端口号不同的时候才算是不同的域,而当你在不同的域之间有数据传递的时候,叫做跨域。
看到这里你还不理解什么叫跨域的话,那就来看看发生跨域的情况
url | 说明 | 是否跨域 |
http://www.baidu.com https://www.baidu.com |
不同协议 | 是 |
http://www.baidu.com http://www.163.com |
不同地址 | 是 |
http://www.baidu.com:80 http://www.baidu.com:8080 |
不同端口 | 是 |
http://www.baidu.com/a.js http://192.168.0.122/a.js |
域名对应的ip地址 | 是 |
http://www.baidu.com/abc/a.php http://www.baidu.com/123/a.php |
同一域名不同文件/文件夹 | 否 |
知道跨域何时发生了,有时业务需要,要用到跨域,这个时候就会有问题了。ajax不是不能跨域吗?那我们就是要想办法使其能跨域!!
方法1——使用代理:
这种方式是通过后台(ASP、PHP、JAVA、ASP.NET)获取其他域名下的内容,然后再把获得内容返回到前端,这样因为在同一个域名下,所以就不会出现跨域的问题。
方法2——JSONP:
假设在http://www.a.com/index.php这个页面中向http://www.b.com/getinfo.php提交GET请求,那么我们在www.a.com页面中添加如下代码:
//创建一个script元素 var Scr = document.reateElement('script'); //声明类型 Scr.type='text/javascript'; //添加src属性,引入跨域访问的url Scr.src='http://www.b.com/gerinfo.php'; //在页面中添加新创建的script元素 document.getElementsByTagName('head')[0].appendChild(Scr)
当GET请求从http://www.b.com/getinfo.php返回时,可以返回一段JavaScript代码,这段代码会自动执行,可以用来负责调用http://www.a.com/index.php页面中的一个callback函数。看下面一个列子:
在www.b.com页面中:
<script> alert('hello 我是b'); </script>
注意:JSONP只支持 “GET” 请求,但不支持 “POST” 请求。
方法3——XHR2
“XHR2” 全称 “XMLHttpRequest Level2” 是HTML5提供的方法,对跨域访问提供了很好的支持,并且还有一些新的功能。
* IE10以下的版本都不支持
* 只需要在服务器端头部加上下面两句代码:
header( "Access-Control-Allow-Origin:*" );
header( "Access-Control-Allow-Methods:POST,GET" );