一、為什麼會出現跨域請求問題
在Web開發中,跨域請求是很常見的問題。網站A的JavaScript發出了一個HTTP請求,請求網站B的資源。然而,由於瀏覽器的同源策略,JavaScript是無法操作跨域的。
所謂同源,指的是協議、域名、端口都相同。例如,http://www.example.com/somedir/page.html就與http://www.example.com/someotherdir/page.html同源,但與http://www.example.net/somedir/page.html不同源。這是因為同為http協議、www.example.com域名、80端口。
因此,當JS腳本執行跨域請求時,瀏覽器會拒絕此請求,如果不加以處理,則請求會失敗。要解決這個問題,我們可以使用CORS(跨域資源共享)。
二、CORS的原理
CORS是由W3C標準化的新型Web技術,允許Web頁面從不同的網域(b域)訪問服務器資源(a域)。它使得瀏覽器可以在服務端區分哪些請求需要尤其謹慎地對待,可以採取特殊的安全策略。
CORS的原理基於HTTP協議。當瀏覽器發現AJAX請求跨源時,即在頭信息中增加Origin字段,告訴遠程服務端這個請求的來源。服務端則要判斷這個請求是否允許。如果允許,就在Response頭信息中,加上Access-Control-Allow-Origin字段,告訴瀏覽器,這個請求可以被跨域訪問。
三、使用axios實現跨域請求的方法
axios是一個基於Promise的HTTP庫,可以用於瀏覽器和Node.js。它支持異步請求、攔截請求和響應、轉換請求數據和響應數據等功能。在這裡我們假設我們的服務端已經配置好允許跨域請求,現在要在前端項目中使用axios實現跨域請求。
第一步:安裝axios。
npm install axios
第二步:添加axios的請求攔截器,設置每個請求的頭信息。
import axios from 'axios'; axios.interceptors.request.use(function (config) { // 每次請求都帶上當前網站的域名 config.headers['Access-Control-Allow-Origin'] = window.location.origin; return config; }, function (error) { return Promise.reject(error); });
這裡我們使用了axios的攔截器,它會在每個請求前自動被發送。我們在請求前通過config.headers[‘Access-Control-Allow-Origin’]設置了頭信息,使得請求中帶上了網站域名。這樣服務端就可以通過Origin字段獲取到當前請求的來源。
第三步:使用axios發送跨域請求
axios.get('http://a.com/data', { headers: { 'Access-Control-Allow-Origin': '*' } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
這裡我們使用了axios的get方法,第一個參數是請求的地址,第二個參數則是頭信息。在頭信息中我們設置了Access-Control-Allow-Origin字段,使得服務端可以識別請求的來源。
四、注意事項
1、通常情況下,配置服務器的跨域規則應該由後端開發人員完成。如果您是前端開發人員,請務必與後端開發人員溝通並協調好跨域規則,避免不必要的錯誤發生。
2、在配置跨域規則時,建議儘可能地限制包括源的數量和方法的數量。因為跨域請求是存在安全風險的,若不加以限制,可能導致服務端資產被泄露或者攻擊。
3、由於瀏覽器的限制,跨域請求是默認不允許發送和接收Cookie的。如果需要發送Cookie,則需要配置後端的Access-Control-Allow-Credentials頭部,將其設置為true。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/254209.html