跨域請求,是前端開發(fā)比較常見的問題。通常為了提高的開發(fā)效率,項目開發(fā)過程中進行前后端分離,部署各自獨立,就可能會出現(xiàn)前端后域名不一致,在通訊過程中就會出現(xiàn)跨域的問題。由于項目開發(fā)過程中涉及,借此機會對跨域問題進行整理。
下面也簡單總結(jié)一下,有以下幾種跨域方式:
JSONP(JSON with Padding)跨域:JSONP實現(xiàn)跨域的核心原理是利用<script>標簽沒有跨域限制的特性,通過在請求的URL中添加回調(diào)函數(shù)名稱,服務(wù)器返回一個JavaScript函數(shù)的調(diào)用,并將需要傳遞的數(shù)據(jù)作為參數(shù)傳遞給該函數(shù)。該方式只支持GET請求,而且只能實現(xiàn)單向數(shù)據(jù)傳輸。CORS(Cross-Origin Resource Sharing)跨域:CORS是一種標準的跨域解決方案,它通過在服務(wù)端設(shè)置Access-Control-Allow-*頭信息來實現(xiàn)跨域。該方式可以支持GET和POST等多種請求方式,而且可以雙向通信,實現(xiàn)更靈活的數(shù)據(jù)傳輸。CORS需要瀏覽器和服務(wù)器同時支持。WebSocket跨域:WebSocket是一種新的協(xié)議,它可以在瀏覽器和服務(wù)器之間建立持久化的連接,從而實現(xiàn)雙向?qū)崟r通信。在跨域方面,WebSocket也需要服務(wù)器支持跨域。代理跨域:代理跨域是一種常見的解決方案,它的核心思想是在客戶端和服務(wù)端之間加一個中間層,將客戶端的請求先發(fā)送給中間層,中間層再將請求發(fā)送給服務(wù)端,待服務(wù)端響應(yīng)后再將響應(yīng)發(fā)送給客戶端。因為是同源策略下的服務(wù)端請求,所以不存在跨域問題。postMessage跨域:postMessage是HTML5引入的一種消息傳遞機制,它可以讓來自不同源的腳本建立通信渠道,從而實現(xiàn)跨域數(shù)據(jù)傳輸。但是該方式需要目標窗口明確設(shè)置監(jiān)聽事件,否則容易受到惡意攻擊。