前端跨域的最經常使用的兩種方式

1、使用jQuery的方式作JSONP跨域php

$.ajax({
            url: "http://blog.csdn.net/Api",
            data: "key=word&jsoncallback=?",
            dataType: "jsonp",
            type: "get",
            success: function (data) {
                  //此處是返回的數據
            },
            error: function (e) {
                
            }
        });        

目前jquery庫已經全面支持跨域的方式,此方式實際上底層也是經過script標籤的方式進行跨域,下面會介紹script標籤的方式。html

經過dataType指定jsonp,底層封裝後,會在head標籤後面追加<script src="http://blog.csdn.net/Api?key=word&jsoncallback=funcName"></script>前端

全部的jsonP都是這個原理,藉助script標籤的跨域特性來實現,funcName再jquery中是自動生成的,後臺會獲取jsoncallback參數,獲取對應的函數名稱,最後包裝成想要的格式,好比最後輸出結果是:funcName({"result":"suc","code":"1000"}),那麼再Jquery中,會將該方法直接指定給success方法,最後來接收返回的數據。jquery

2、使用CORS跨域ajax

要使用CORS,咱們須要瞭解前端和服務器端的使用方法。json

        一、  前端小程序

        之前咱們使用Ajax,代碼相似於以下的方式:微信小程序

   

var xhr = new XMLHttpRequest();  
xhr.open("GET", "/api", true);  
xhr.send();  

   這裏的「/hfahe」是本域的相對路徑。api

        若是咱們要使用CORS,相關Ajax代碼可能以下所示:跨域

var xhr = new XMLHttpRequest();  
xhr.open("GET", "http://blog.csdn.net/api", true);  
xhr.send();  

    請注意,代碼與以前的區別就在於相對路徑換成了其餘域的絕對路徑,也就是你要跨域訪問的接口地址。

        咱們還必須提供瀏覽器回退功能檢測和支持,避免瀏覽器不支持的狀況。

function createCORSRequest(method, url) {  
  var xhr = new XMLHttpRequest();  
  if ("withCredentials" in xhr) {  
    // 此時即支持CORS的狀況  
    // 檢查XMLHttpRequest對象是否有「withCredentials」屬性  
    // 「withCredentials」僅存在於XMLHTTPRequest2對象裏  
    xhr.open(method, url, true);  
   
  } else if (typeof!= "undefined") {  
   
    // 不然檢查是否支持XDomainRequest,IE8和IE9支持  
    // XDomainRequest僅存在於IE中,是IE用於支持CORS請求的方式  
    xhr = new XDomainRequest();  
    xhr.open(method, url);  
   
  } else {  
   
    // 不然,瀏覽器不支持CORS  
    xhr = null;  
   
  }  
  return xhr;  
}  
   
var xhr = createCORSRequest('GET', url);  
if (!xhr) {  
  throw new Error('CORS not supported');  
}  

如今若是直接使用上面的腳本進行請求,會看到瀏覽器裏控制檯的報錯以下:

錯誤顯示的很明顯,這是由於咱們還未設置Access-Control-Allow-Origin頭。

二、  服務器

        服務器端對於CORS的支持,主要就是經過設置Access-Control-Allow-Origin來進行的。若是瀏覽器檢測到相應的設置,就能夠容許Ajax進行跨域的訪問。

        HTTP 頭的設置方法有不少,http://enable-cors.org/這篇文章裏對各類服務器和語言的設置都有詳細的介紹,下面咱們主要介紹Apache和PHP裏的設置方法。

        Apache:Apache須要使用mod_headers模塊來激活HTTP頭的設置,它默認是激活的。你只須要在Apache配置文件的<Directory>, <Location>, <Files>或<VirtualHost>的配置里加入如下內容便可:

  1. Header set Access-Control-Allow-Origin *  

  PHP:只須要使用以下的代碼設置便可。

  1. <?php  
  2.  header("Access-Control-Allow-Origin:*");  

以上的配置的含義是容許任何域發起的請求均可以獲取當前服務器的數據。固然,這樣有很大的危險性,惡意站點可能經過XSS攻擊咱們的服務器。因此咱們應該儘可能有針對性的對限制安全的來源,例以下面的設置使得只有http://blog.csdn.net這個域才能跨域訪問服務器的API。

Access-Control-Allow-Origin: http://blog.csdn.net  

 

近期剛上線一門基於微信小程序、公衆號和小程序雲開發的微信受權、分享和支付的專項課程,若是你對支付感興趣能夠考慮入手:

https://coding.imooc.com/class/343.html

React全家桶開發通用的後臺管理系統:

https://coding.imooc.com/class/236.html

Vue2.0+Vue-Router+Vuex+Node+Mongo開發全棧商城課程

https://coding.imooc.com/class/113.html

慕課講師:河畔一角

講師地址:http://www.imooc.com/u/1343480

相關文章
相關標籤/搜索