Rails中跨域请求的解析
如何进行跨域资源请求
可以通过以下两种方式进行跨域资源请求:
- JSONP
- CORS(cross-origin resource sharing: 跨来源资源共享)
什么是JSONP
关于JSONP,以下是来自维基百科的介绍:
JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。另一个解决这个问题的新方法是跨来源资源共享。
由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com 的服务器沟通,而 HTML 的
<script>
元素是一个例外。利用<script>
元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的 JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
所有支持Javascript的浏览器都支持[同源策略] (http://zh.wikipedia.org/wiki/%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5) (来自维基百科),而html中的img,script等标签是不用遵循同源策略的。JSONP相当与利用了script的这个特点,去加载不同origin的资源。
JSONP的原理,简单来说就是加载不同origin的脚本,然后执行。一般来说,一些资源都是一些数据,比如JSON格式,而script加载的是js文件并执行,那么要求返回的是一个可执行的js文件,而服务器端只提供数据,并不知道客户端要如何处理这个数据。所以一般客户端可以写一个回调函数,然后把回调函数的名字告诉服务器端,而服务器端会将json数据作为参数,包含上回调函数的名字,然后将wrapper后的内容作为js文件返回。
具体流程可以参照下图: