跨域問題:“No'Access-Control-Allow-Origin'headerispresentontherequestedresource”解決
今天試了一下只用SpringMVC寫介面,然後用本地的 ajax 去訪問介面請求 json 資料,但瀏覽器報了一個“跨域”請求的錯誤,個人理解的跨域問題是,服務端和客戶端的請求不在同一個域名下,但是我這都是在本機上部署的呀,這是什麼問題呢?
原來我理解的“跨域”只是我個人的理解,在網上搜索解決方法,都是在SpringMVC 的伺服器中寫一個過濾器 Filter ,讓 Filter 攔截請求,在response返回的時候加上一些請求頭,這樣就可以解決跨域的問題,類似於下面這樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
by kay on 2017/12/7.
|
然後在web.xml中配置一下filter:
1 2 3 4 5 6 7 8 |
|
而在前端請求中,ajax 引數中的 dataType 要改為 “text”,不支援 dataType:”json”:
1 2 3 4 5 6 7 8 9 10 11 |
|
為什麼要加像 ”Access-Control-Allow-Origin“ 這樣的響應頭就能解決跨域問題呢?
跨域請求又叫,”跨域資源共享”(Cross-origin resource sharing),它允許瀏覽器向跨源伺服器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。
CORS需要瀏覽器和伺服器同時支援。
伺服器會檢查 瀏覽器的請求中是否 有 ”Origin“請求頭,它是在跨域請求發出的時候 由瀏覽器自動加上的,然後伺服器檢查這個 請求頭設定的 伺服器的源(來自於哪裡)來判斷是否響應,是否允許這個請求訪問,我們會看到設定response.setHeader("Access-Control-Allow-Origin", "*"); 它的意思就是允許所有的源訪問伺服器,也可以只將自己的源(域名)設定就不允許其他的源訪問。