关于浏览器跨域的一种实现--jsonp
最近一直在搞python,前端技术荒废很久了,今天跟前端联调,设计到一个前端跨域的问题;前端人员告诉我可以用jsonp的方式实现,经他这么一提醒,也是豁然开朗。
jsonp的实现方式我按照我的理解说一下:
在浏览器层面上,有一个同源策略,这个策略限制了,一个域下的网页,去get一个其他域下的数据,做到不同域之间的数据隔离。
但是html里面有写元素是可以获取其他域下的数据,比如,<img src='x x x.com/img/xxx/xxx.jpg' /> img标签就可以获取外域下的图片资源,
同理,<script> 是可以获取外域下的脚本代码的:<script src='text/javascript' src='http://xxxx.com/xxxx/action.do?callback=showdata'/>
服务器收到请求后,先封装页面想要的数据作为参数,然后使用callback传上的参数作为函数名,返回一段javascript脚本:
would_data = getData() #封装数据
callback = request.callback #获取回调函数
return 'callback("%s")' % would_data #返回一段脚本
客户端本地构造请求url:http://xxxx.com/xxxx/action.do?callback=showdata ,其中showdata在本地预先定义一个,参数为想要的数据,这样当去服务器远程获取数据后,
会自动调用本地的回调函数,会已传参的方式,获取到数据。这整个是jsonp的实现原理,其实并没有多么高深,我之前也怀疑过为什么不能去外域请求数据,但却可以获取到
像<img><srcirt><css>这用的标签去访问外域数据,早研究下,就知道有这个好东西了。 ^ ^
其实,像jquery这种框架早就支持这个东西了,type='jsonp' 就可以了,也不用带回调函数参数