首先明确一下跨域:
怎样才能算跨域?协议,域名,端口都必须相同,才算在同一个域。
之前有见过ajax跨域一种方式,JSONP
,不过看了以后感觉并不好用
比较一下json与jsonp格式的区别:
json格式:
{ "message":"获取成功", "state":"1", "result":{"name":"工作组1","id":1,"description":"11"}}
jsonp格式:
callback({ "message":"获取成功", "state":"1", "result":{"name":"工作组1","id":1,"description":"11"}})
需要后台获取数据的地方再做一次处理,不够理想,而且处理数据会麻烦一点,并且JSONP不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。
后面找到一种比较合理的调用方式:在header中加入 Access-Control-Allow-Origin: *
,可以实现ajax同域名一样的调用效果,例如在rails项目中只需要在action的after_fileter中加入一句
<pre>response.header['Access-Control-Allow-Origin'] = '*'</pre>
不过考虑到安全性还是尽量不要写*
的好,比如我想实现指定domain下可以调用则可以写成:
<pre>
response.header['Access-Control-Allow-Origin'] = request.env["HTTP_ORIGIN"] if request.env["HTTP_ORIGIN"].to_s.end_with?('.xxxx.com')
</pre>