Ajax跨域:jsonp还是CORS
Posted 暖风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ajax跨域:jsonp还是CORS相关的知识,希望对你有一定的参考价值。
跨域一般用jsonp,兼容性比较好。
CORS是html5最新的XHR第二版本,不支持IE8,IE9,对移动端的支持非常好。
但是考虑项目后期这部分会转到同域名下,而且网址不需要支持ie8,ie9,所以我们考虑使用html5最新的跨域资源共享(CORS)来实现跨域请求。
http://a.test.com/cross.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>sub domain</title> <link rel="stylesheet" href="css/bootstrap.min.css"> <link rel="stylesheet" href="css/bootstrap-theme.min.css"> <link rel="stylesheet" href="css/main.css"> <script src="js/jquery-1.11.3.js"></script> <script src="js/jQuery.XDomainRequest.js"></script> </head> <body> <h3>跨域限制</h3> <button class="btn btn-primary btn-sm" onclick="crossAjax();">跨域请求</button> <hr /> <h3>IE8,9跨域限制</h3> <button class="btn btn-primary btn-sm" onclick="ieCrossAjax();">跨域请求</button> <hr /> <script> function crossAjax() { // var url = \'http://192.168.1.138:8080/msjc-admin/index\'; var url = \'http://b.test.com/test.php\'; $.ajax(url).done(function(data) { alert(data.name); }).fail(function() { alert(\'请求失败\'); }); } function ieCrossAjax() { var url = \'http://b.test.com/test.php\'; // var xdr = new XDomainRequest(); // xdr.open("get", url); // xdr.onload = function() { // var data = JSON.parse(xdr.responseText) // alert(data.name); // } // xdr.send(); // GET // $.getJSON(url).done(function(data) { // alert(data.name); // }); $.ajax({ url: url, type: \'GET\', dataType: \'json\' }).done(function(data) { alert(data.name); }); // POST // POST // $.ajax({ // url: url, // data: { // name: \'nuanfeng\', // gender: \'boy\' // }, // contentType: \'text/plain\', // type: \'POST\', // dataType: \'json\' // }).done(function(data) { // console.log(data); // }); // $.post(url, { // name: "Donald Duck", // gender: "Duckburg" // }, // function(data, status) { // alert("Data: " + data.name + "\\nStatus: " + status); // }); } </script> </body> </html>
php - server:
<?php $ret = array( \'name\' => isset($_POST[\'name\'])? $_POST[\'name\'] : \'myName\', \'gender\' => isset($_POST[\'gender\'])? $_POST[\'gender\'] : \'myGender\' ); // $ret = file_get_contents("php://input"); // $ret = $ret=>\'name\'; // $ret = json_encode($ret); header(\'content-type:application:json;charset=utf8\'); // 指定可信任的域名来接收响应信息 header(\'Access-Control-Allow-Origin:*\'); // header(\'Access-Control-Allow-Methods:POST\'); // header(\'Access-Control-Allow-Headers:x-requested-with,content-type\'); echo json_encode($ret); ?>
如果需要支持ie8,ie9,可以判断ie情况下使用XDomainRequest来实现:
var xdr = new XDomainRequest(); xdr.open("get", url); xdr.onload = function() { var data = JSON.parse(xdr.responseText) alert(data.name); } xdr.send();
上面的cross.html中,我们引入了一个jQuery.XDomainRequest,它就是封装了XDR(XDomainRequest)来支持ie8和ie9. (http://www.tuicool.com/articles/Njiiamm)
关于CORS更详细点的介绍:http://blog.csdn.net/fdipzone/article/details/46390573 http://www.cnblogs.com/yuzhongwusan/p/3677955.html
以上是关于Ajax跨域:jsonp还是CORS的主要内容,如果未能解决你的问题,请参考以下文章
WeX5 - AJAX跨域调用相关知识-CORS和JSONP
CORS - 没有 JSONP 的跨域 AJAX 通过允许服务器上的 Origin