天天看点

关于跨域的一些事

跨域分两种:跨子域和跨全域。从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>