跨域问题之ajax
前端跨域問題比較集中的出現在ajax跨域上,事實上我也回答過很多相關的問題,線上線下都有。這里簡單的列舉幾類。
首先澄清一點,瀏覽器的同源策略引起了跨域訪問限制這個問題。同源策略的初衷是阻止惡意js腳本訪問其他域的敏感數據(設想其他網站的js代碼可以調用你網銀的支付或者轉賬功能)。但有很多網站,前后臺不在同一個域下,或者多個域下的幾個子頁面需要交換數據,這就必須繞過同源策略,這就是跨域。針對要訪問資源的不同,跨域有很多種方式,今天說的是ajax的跨域問題。但我們不討論具體的實現,只是列舉我解答過的幾種問題。這幾種問題回答的次數都不少,具有普遍性,所以覺得有必要記錄一下。
為什么form表單可以直接訪問后臺API,ajax不行?
跨域問題針對的是比較危險的js代碼,不會阻止其他動作觸發的跨域訪問。
為什么ajax發出了并且后臺正確相應(比如返回碼是200 OK),然后才是瀏覽器阻止跨域并報錯?
首先同源策略是瀏覽器本身的策略,這意味后臺服務器并不關心前臺是否跨域。所以數據沒問題的話,后臺可以正常返回結果。
當瀏覽器收到服務器的返回數據之后,檢查來源,發現和腳本的執行方并不屬于同一域,并且未發現后臺允許此域下腳本訪問(根據一組http header,這個我會另開一篇文章單獨說明),于是丟棄結果并報告錯誤。注意,此時js腳本不能收到數據。
有的同學可能要問為什么瀏覽器不在盡可能早的時候阻止對后臺的訪問?因為瀏覽器并不能確定后臺是否允許訪問,所以它必須等到后臺返回,檢查結果中是否包含一組特殊的http header,以說明腳本執行方是否有訪問權限。如果有,則將數據轉交給js代碼,如果沒有,則丟棄結果,報告錯誤。
為什么我使用了jquery 的jsonp,但依然無法得到后臺的數據?
jsonp需要后臺配合你,也即是,后臺也需要實現相關的功能。使用jsonp訪問訪問任何受限制的API,是不可能的。
歡迎大家留言,如果有比較典型的問題,我會繼續追加到這篇文章后面,謝謝。
如果對你有所幫助或者啟發,請幫我點贊和收藏。
總結
- 上一篇: linux ifconfig route
- 下一篇: 跨主机使用 Rex-Ray volume