由於安全限制(同源策略, 即JavaScript或Cookie只能訪問同域下的內容),ajax跨域請求的兩種方案
方案一:jsonp (JSON with Padding)
但是jsonp有一個缺點就是不支援get傳參
方案二:CORS(跨域資源共用,Cross-Origin Resource Sharing)
此方案支援post提交
假設我們在http://www.a網域名稱.com網域名稱ajax請求http://www.111cn.net網域名稱下的資料;若使用cors來實現,ajax跨域請求。
只要在http://www.111cn.net域要在被請求的php指令碼頭部添加
header("Access-Control-Allow-Origin:http://www.a網域名稱.com");便可。
這句的意思是允許http://www.a網域名稱.com跨域訪問到http://www.111cn.net域
代碼執行個體:
[http://www.a網域名稱.com網域名稱下的 index.html 檔案]
代碼如下 |
複製代碼 |
<!--此網域名稱在http://www.a網域名稱.com網域名稱下--> <html> <head> <title>CORE-AJAX跨域</title> <meta charset="utf-8" /> <script src="http://gongwen.sinaapp.com/Public/Js/jquery-1.7.2.min.js"></script> </head> <body> <script type="text/javascript"> $(function(){ var url='http://www.111cn.net/server.php'; $.post(url,{name:'鞏文',blog:'www.bestphper.cn'},function(data){ var info=eval('('+data+')'); $('body').html('name:'+info.name+'<br>blog:'+info.blog+'<br>from:'+info.from); }); }); </script> </body> </html> |
[http://www.111cn.net網域名稱下的 server.php 檔案]
代碼如下 |
複製代碼 |
<?php //注此檔案在http://www.111cn.net網域名稱下 //header("Access-Control-Allow-Origin:http://www.a網域名稱.com"); $arr=array( 'name'=>$_POST['name'], 'blog'=>$_POST['blog'], 'from'=>'http://www.111cn.net' ); echo json_encode($arr); |
[Firefox瀏覽器訪問 http://www.a網域名稱.com ]
那麼問題來了,如何用CORS來解決這個ajax跨域問題呢?
只要將http://www.111cn.net網域名稱下的server.php檔案中的
//header("Access-Control-Allow-Origin:http://www.a網域名稱.com");
的注釋去掉便可。去掉之後再用瀏覽器進行訪問http://www.a網域名稱.com
[其它]
若把php檔案的
header("Access-Control-Allow-Origin:*");寫成這樣,則說明任務一個域都可以去ajax請求此檔案