ajax服务跨域问题解决办法

对于复杂应用的开发,往往会遇到跨域的问题,跨域是指浏览器认为客户端的请求不是一个安全的请求,即访问了非当前服务器(协议,ip,端口号不同)所在的服务。
接下来介绍几种我个人处理跨域的方法。

  1. 采用jsonp的方式。
    因为跨域问题一般出现在ajax调用后端服务时,因而,倘若我们的script脚本看起来不是一个服务端请求,例如是从其他域的一个文本请求,好比script标签里面的src属性所指向的地址,客户端则不认为这是一个跨域问题,而是一个正常的script下载脚本,那么客户端便会正常向服务器发起请求,请求时需要携带一个回调函数作为请求参数,此时服务器端接受到这个请求后,获取请求路径的参数,然后做业务处理,将结果组织为一个函数调用的文本返回到前台,前台执行这段文本。例如:
    请求url为http://www.test.com/service?callback=getData
    服务端返回数据为getData({“name”:”test”});
    随后前台执行一下这个函数即可。
    具体内部实现逻辑如下:
var eleScript= document.createElement("script");
eleScript.type = "text/javascript";
eleScript.src = "http://www.test.com/appName/getinfo";
document.getElementsByTagName("HEAD")[0].appendChild(eleScript);

采用这种方式的最大问题就是服务端要支持这种形式的处理,相对比较麻烦。
2. 服务端代理的方式
这种方式对于我个人而言,是一种比较喜欢的方式,因为服务端不需要关心跨域的问题,具体思想如下:
客户端A需要调用服务端A和服务端B的东西,我们采用例如nginx等web服务器来对服务端A和服务端B做一个反向代理,使得客户端认为这个服务器就是自己的同源服务器,这样就不会有跨域的问题了。
具体服务器变化为:
由nginx反向代理APP Server
即由nginx Server反向代理APP Server,从而避免跨域问题。
3. 服务注册
相对复杂的一种方式,适用于分布式的场景,即在分布式场景下,会有多个后端的服务器,除了采用第2种方式对多个后端服务器做反向代理以外,还可以利用服务端服务注册的方式来解决。
即服务端和客户端的连接通过服务注册表来关联,而对于不同域的服务器而言,只需要将服务注册在这个服务注册表上即可,客户端访问后端服务通过同一个域的服务器接入,接入后根据url或请求参数中的服务标示来哉服务注册表中找到对应的服务进行调用,对于客户端而言访问的始终是本域的服务,而对于服务端而言,则需要根据服务这册表上的信息和请求信息来执行一次远程调用。此种场景由于开发成本相对高,一半仅仅适用于大型网络系统。一般我们采用的服务注册表是zookeeper,主要由于zookeeper具有的一致性算法能够有效保证在分布式场景下的数据实时同步。具体原理不再细讲,这里提一下,后续会针对这块另开一个blog。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值