一、跨域概述
跨域是指瀏覽器在執行JavaScript腳本時,訪問不同域名或不同端口的服務器時所產生的安全限制問題。國際互聯網從1996年才開始出現真正的跨域,從HTTP協議規範出現到現在,存在的問題越來越多,其中跨域引起的問題受到越來越多的關注。
目前,主流瀏覽器對於跨域問題都有了一些克服策略。不同的跨域問題,不同的瀏覽器克服策略不同,所以跨域問題的解決方法也不盡相同。
二、跨域類型
跨域類型主要有以下幾種:
1. 域名不同
例如在本地開發測試時,前端頁面是通過localhost:8080訪問,而後端接口是通過localhost:9090來訪問。
2. 端口不同
例如前端頁面通過80端口來訪問頁面,而後端接口卻是通過其他端口(如81、82等)來提供服務的。
3. 協議不同
例如前端頁面通過https協議來訪問,而後端接口卻是通過http協議來提供服務的。
4. 域名和子域名不同
例如前端頁面通過www.baidu.com來訪問,而後端接口是通過api.baidu.com來提供服務的。
三、常見跨域方法
1. JSONP
JSONP是最常用的跨域方法之一,JSONP的基本思路是通過動態創建script標籤的方式,來實現不同域之間的數據傳輸。客戶端先定義一個回調函數,然後把這個函數的名字傳遞給服務器,服務器在返回的數據中將這個函數名作為參數的一部分,客戶端只需要執行這個函數,就能拿到需要的數據了。
<script>
function weather(data) {
console.log(data);
}
</script>
<script src="http://api.xxxxx.com/weather?callback=weather"></script>
這種方法需要服務端的接口返回一個函數調用,函數調用的參數為數據。同時,由於是通過script標籤來實現跨域的,所以接口返回的是一段可執行的JavaScript代碼,因此實現起來相對簡單。
2. CORS
CORS是現代瀏覽器所支持的一種跨域解決方案,全稱Cross-Origin Resource Sharing,即“跨域資源共享”。在前端實現時,只需要在服務器端添加一些響應頭信息,瀏覽器就可以自動處理跨域請求了。具體而言,需要在服務器端添加Access-Control-Allow-Origin和Access-Control-Allow-Methods等響應頭信息。例如:
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST,GET,OPTIONS');
header('Access-Control-Allow-Headers:x-requested-with,content-type');
這種方法需要服務端的支持,增加了前端和後端的代碼工作量,但是可以有效控制跨域訪問。
3. 通過代理跨域
通過代理跨域的思路是前端通過AJAX向代理服務器發送請求,代理服務器再將請求發送給接口服務器,接口服務器返回數據後,代理服務器再將數據返回給前端。
這種方法需要在代理服務器上配置一個接口轉發的規則(如Apache中的mod_proxy模塊),需要一些額外的服務器資源,但是可以實現跨域效果,並且不依賴瀏覽器的配置。
四、PHP實現CORS跨域訪問
1. 前端代碼實現
前端代碼實現時,在發送請求時需要加上以下代碼,表示同意跨域訪問:
var xhr=new XMLHttpRequest();
xhr.open('GET','http://api.xxxxx.com/weather',true);
xhr.setRequestHeader('Content-Type','application/json;charset=UTF-8');
xhr.withCredentials=true;
xhr.send();
其中xhr.withCredentials=true表示跨域訪問時需要發送cookies等認證信息。
2. 後端代碼實現
後端代碼實現時,在接收到請求時,需要進行跨域訪問授權,示例代碼如下:
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS');
header('Access-Control-Allow-Headers:x-requested-with,content-type');
這些響應頭信息表示允許訪問所有域名,跨域訪問方式包括GET、POST、PUT、DELETE和OPTIONS,可以使用的請求頭包括x-requested-with和content-type。
五、總結
跨域問題在現代前端開發中越來越普遍,因此了解跨域問題,掌握跨域解決方法是非常重要的。本文主要介紹了跨域概述、跨域類型、常見跨域方法以及PHP實現CORS跨域訪問的方法,希望能夠幫助讀者更好地解決跨域問題。
原創文章,作者:YMCAO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/334475.html