什么是跨域
简单的理解就是因为javascript同源策略的限制(同源策略: javascript或是cookie 默认只允许访问同域名下的内容),例如a.com
下不能访问b.com
下的内容,这就是跨域.
不同域条件
先看看域名的组成:
当协议
子域名
主域名
端口号
任意一个不相同,就算是不同域
,
跨域解决
jsonp
jsonp
利用的是script
标签来实现(毕竟script
不存在跨域问题),
只支持GET
请求,不支持POST
请求
一般在URL
中传入一个callback
的参数,用来调用函数
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
请求
但是这个方法IE10
以下不支持基本思想
: 使用自定义的HTTP头部
让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是 应该失败。
在php
页面添加一下代码:
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);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。