jQuery的ajax跨域 Jsonp原理

1、Jsonp

Jsonp(json with padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。

Jsonp是为了解决ajax跨域发送http请求出现的,利用Script标签的特性跨域。浏览器由于安全考虑,在编写ajax程序时,httprequest/xmlhttp都不能发送非本域的http请求,是被浏览器所禁止的。所以ajax本身是无法跨域的。

2、同源策略

www.a.com网页的ajax获取www.b.com接口的内容,由于您的网页域名是www.a.com,而您发送的ajax请求的目标域却是www.b.com。浏览器会阻止这一的请求,这就是所谓的同源策略。

同源是指:js脚本只能访问或者请求相同协议,相同domain(网址/ip),相同端口的页面。

我们知道,js脚本可以访问所在页面的所有元素。通过ajax技术,js也可以访问同一协议,同一个domain(ip),同一端口的服务器上的其他页面,请求到浏览器端之后,利用js就可以进行任意的访问。但是对于协议不同, 或者domain不同或者端口不同的服务器上的页面就无能为力了,完全不能进行请求。下面是例子:(http://localhost:57269/页面)

<script type="text/javascript">

    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = ActionXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            console.log(xmlhttp.responseText);
        }
    }
    var url = "http://localhost:51355/Common/Test";
    xmlhttp.open("Get", url, true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send();

script>

这里为了结果不受其他js库的干扰,使用了原生的XMLHttpRequest来处理,结果如下:

我们看到57269端口的ajax请求无法访问51355端口的页面。原因是“同源策略禁止读取“某某”的远程资源”。因为同源策略,普通的ajax无法跨域请求,解决这种问题的方式就是Jsonp。

3、Jsonp跨域的原理

我们发现凡是拥有"src"这个属性的标签都拥有跨域的能力,在页面上有三种资源是可以与页面本身不同源的。它们是:js脚本,css样式文件,图片,如下所示,它们是可以链接访问到不同源的资源的。

1)

2)

3)

而jsonp就是利用了

C# MVC代码:

//方式一
public ActionResult Test()
{
    string callback = Request["callback"]; //jsonp1503629838983
    string name = "cang";
    string age = "20";
    string response = "{\"name\":\"" + name + "\",\"age\":\"" + age + "\"}";
    System.Web.Script.Serialization.JavaScriptSerializer jss = new System.Web.Script.Serialization.JavaScriptSerializer();
    string call = callback + "(" + jss.Serialize(response) + ")"; //jsonp1503629838983("{\"name\":\"cang\",\"age\":\"20\"}")

    return Content(call);
}
//方式二
public void Test()
{
    string callback = Request["callback"]; //jsonp1503629838983
    string name = "cang";
    string age = "20";
    string response = "{\"name\":\"" + name + "\",\"age\":\"" + age + "\"}";
    System.Web.Script.Serialization.JavaScriptSerializer jss = new System.Web.Script.Serialization.JavaScriptSerializer();
    string call = callback + "(" + jss.Serialize(response) + ")"; //jsonp1503629838983("{\"name\":\"cang\",\"age\":\"20\"}")
   
    Response.Write(call);
    Response.End();
}

下面是我理解的josnp的原理(个人观点):

一个简单的JSONP请求可以通过一下代码实现:

大概可以看出来,是创建了一个

你可能感兴趣的:(jQuery的ajax跨域 Jsonp原理)