JavaScript中的跨域問題

  跨域問題其實很廣泛的存在的,如何解決跨域問題呢,跨域問題究竟是怎麼產生的,解決方法的由來又是什麼?我以爲看了視頻講解,值得寫下來,記錄下來。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的配置文件,你須要更加深刻的學習。

相關文章
相關標籤/搜索