Ajax跨域

什么是跨域

简单的理解就是由于javascript同源策略的限制(同源策略: javascript或是cookie 默认只容许访问同域名下的内容),例如a.com下不能访问b.com下的内容,这就是跨域.javascript

不一样域条件

先看看域名的组成:
图片描述
协议 子域名 主域名 端口号任意一个不相同,就算是不一样域,php

跨域解决

  • jsonp
    jsonp利用的是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);
   }
}
相关文章
相关标签/搜索