简单的理解就是由于javascript同源策略的限制(同源策略: javascript或是cookie 默认只容许访问同域名下的内容),例如a.com
下不能访问b.com
下的内容,这就是跨域.javascript
先看看域名的组成:
当协议
子域名
主域名
端口号
任意一个不相同,就算是不一样域
,php
jsonpjsonp
利用的是script
标签来实现(毕竟script
不存在跨域问题),java
只支持GET
请求,不支持POST
请求
通常在URL
中传入一个callback
的参数,用来调用函数json
function getJSON(url,fn){ // 建立 script标签 var oScript = document.createElement('script'); oScript.src = url; document.body.appendChild(oScript); var reg = /callback=([^&]+)/; var fnName = url.match(reg)[1]; // 挂载window window[fnName] = fn; // 函数在服务器端 执行 oScript.onload = function(){ document.body.removeChild(oScript); delete(window[fnName]); } }
PHP
页面:跨域
echo $_GET['callback'].'({"name":"hello"})';
以上就是jsonp
方法的主要实现.浏览器
毕竟 jsonp
不能实现POST
请求 服务器
CORS
这个方法既能够实现post
又能够实现 get
请求cookie
可是这个方法IE10
如下不支持基本思想
: 使用自定义的HTTP头部
让浏览器与服务器进行沟通,从而决定请求或响应是应该成功仍是 应该失败。
在php
页面添加一下代码:app
header("Access-Control-Allow-Origin:*"); header("Access-Control-Allow-Methods","GET,POST");
CORS
function createCORS(fn,url){ var xhr = new XMLHttpRequest(); if('withCredentials' in xhr){ xhr.open(fn,url,true); }else if(typeof XDomainRequest() != 'undefined'){ cxhr = new XDomainRequest(); cxhr.open(fn,url); } }