跨域分兩種:跨子域和跨全域。從easydb.dtstack.com發送httprequest到www.dtstack.com,這樣的叫跨子域;從www.baidu.com發送httprequest到www.dtstack.com,這樣的叫跨全域。
關于跨域通信,目前已經有了很多方法,最常見的就是jsonp,但jsonp和
解決跨子域有純前端的方案,比如從easydb.dtstack.com跨子域通路www.dtstack.com,隻需要在js中設定
<code>document.domain = 'dtstack.com'</code>
然後正常發送請求就行了。
也有前後端配合的方案,可以參考跨全域的方案。
跨全域通信的關鍵在于被通路的伺服器允許通路方進行通路。
是以,一般發送跨域請求時,浏覽器會“詢問”伺服器是否允許目前請求進行通路,“詢問”的方式是通過發送一個options請求,這時被通路伺服器需要傳回一些資訊表示是否允許,這些資訊一般放在http header中。這樣,如果被通路伺服器傳回表示允許通路的http header,那麼浏覽器就會發送使用者建立的跨域請求,這樣就完成了跨域通信了。
基本原理弄清楚了,接下來就是實作細節了。
django中,我們可以添加一個中間件來為跨域請求設定恰當的http header。首先建立一個cross_domain_middleware.py檔案
,同時在settings檔案中添加
,最後在django的middleware配置中添加我們建立的cross_domain_middleware
目前allowed_hosts_for_middleware 隻支援多個域名顯示配置,也可以使用正則動态比對。
注意django中的allowed_hosts并不是為了跨域的配置,而是針對全局請求通路的一個配置,如果直接覆寫,可能會導緻全站400,本地開發時由于django的調适辨別debug都為true,django這時是預設允許所有請求通路的,是以即使覆寫了allowed_hosts也不會有問題,而到了線上,debug切換到false,就會有“驚喜”了。
參考:
<a href="http://liuyunclouder.github.io/2016/08/17/%e5%85%b3%e4%ba%8e%e8%b7%a8%e5%9f%9f%e7%9a%84%e4%b8%80%e4%ba%9b%e4%ba%8b/">http://www.html5rocks.com/en/tutorials/cors/</a>