跨域問題其實很廣泛的存在的,如何解決跨域問題呢,跨域問題究竟是怎麼產生的,解決方法的由來又是什麼?我以爲看了視頻講解,值得寫下來,記錄下來。ajax
1、跨域問題是怎麼產生?spring
概念:只要協議、域名、端口有任何一個不一樣,都被看成是不一樣的域。json
瀏覽器對ajax請求的限制,不容許跨域請求資源。後端
http://www.a.com →http://www.b.com 是跨域api
http://www.a.com→ http://www.a.com:8080 是跨域跨域
http://a.a.com →http://b.a.com 是跨域瀏覽器
http://www.a.com →http://www.a.com/api 不是app
解決方案:---jsonpjsp
2、跨域問題的底層是怎麼回事?(推導一下)函數
一、編寫json.jsp(後臺系統)
二、在後臺系統中編寫test-json.htm
三、將test-json.htm 拷貝到前臺系統進行測試
發現:
一、 alert($) 能夠正常彈出
二、 alert(data.abc) 不可以正常的彈出,出現跨域問題
結論:script標籤的src能夠跨域請求資源,可是ajax請求不能夠跨域請求。
疑問:可否藉助script標籤的src進行加載數據? --能夠的。
四、藉助script的src跨域加載資源
發現:
請求資源能夠正常請求,可是,報js解析出錯。
緣由:
Script標籤加載到資源後,會將資源當作是js腳本解析,可是咱們返回的是json數據,因此致使解析失敗。
解決:只須要返回js腳本便可。
五、後端系統返回JS腳本
測試:
發現:
返回的js腳本成功解析,可是,fun沒有定義。
解決:定義個一個fun方法便可。
六、定義fun方法
測試:
總結:
Jsonp的原理:
一、 jsonp經過script標籤的src能夠跨域請求的特性,加載資源
二、 將加載的資源(經過一個方法名將數據進行包裹)當作是js腳本解析
三、 定義一個回調函數,獲取傳入的數據
七、優化
將回調函數名傳遞到服務端,返回:
調用方:
八、經過jQuery使用jsonp請求
3、解決項目中跨域問題的方案是什麼?
一、後臺系統Controller
二、測試
問題解決,可是帶來了新問題,亂碼問題。
三、解決亂碼問題
3.1 亂碼產生的緣由
在SpringMVC中產生的響應有2類:
(1) ModelAndView
(2)返回數據響應:使用消息轉化器完成
找到這個類:StringHttpMessageConverter.class
默認使用的字符串消息轉換器:發現,默認使用ISO-8859-1,因此會產生亂碼。
3.2 解決亂碼
四、統一支持jsonp
(1) 擴展CallbackMappingJackson2HttpMessageConverter
(2)配置
(3)Controller實現
總結:經過這個學習,知道了亂碼問題的另外一個緣由以及解決方案,原來註解驅動也是能夠配置的,看來是本身對springMVC的理解只是存在於表面上,spring的配置文件真的很強大,能很好的解決代碼耦合度太高的問題,還可以很好的優化代碼,之後這方面真的須要深刻的學習,經過視頻中項目的講解,差很少可以把一些線程池,鏈接池的代碼轉換成spring的配置文件,你須要更加深刻的學習。