设为首页 收藏本站
查看: 808|回复: 0

[经验分享] 跨域解决方案(基于nodejs)

[复制链接]

尚未签到

发表于 2017-2-21 12:45:07 | 显示全部楼层 |阅读模式
转载自:
跨域是web开发过程中经常会遇见的一种问题,因为javascript的同源策略的限制,a.com域名下是无法操作b.com下的对象或者调用接口的。

  • 什么情况算跨域?
request urlresponse url说明是否允许通讯www.a.com/a.jswww.a.com/b.js同一域名允许www.a.com/a.jswww.a.com:8080/b.js同一域名,端口不同不允许http://www.a.com/a.jshttps://www.a.com/b.js同一域名,协议不同不允许www.a.com/a.jsblog.a.com/b.js一级域名相同,二级域名不同不允许www.a.com/a.jswww.b.com/b.js不同域名不允许 
目前解决跨域的方法比较多,通常有iframe、动态创建script、document.domain、flash、jsonp、cors、postMessage这几种。但本文只给出jsonp、cors与postMessage三种的测试例子。
 
测试环境

  • node.js ~0.12.0
  • express ~4.12.1
  • jade ~1.9.2
 
1. JSONP
JSONP跟JSON是什么关系?JSONP的实现原理是什么?我就不造轮子了,因为我也是看了别人的文章才理解的,直接推荐一篇讲得很清晰的博文。了解后,就开始本地的代码测试吧。
本地模拟跨域
本地要模拟跨域,一开始我是通过使用node启动一个地址为127.0.0.1:3000的server,然后本地在配一个frend.com(这个是nginx启动的一个静态资源server,端口是80,host配置中指向127.0.0.1)。然而这个在调试的过程中居然不跨域,普通的ajax请求居然通过了,这个我也不太理解。 
既然上面的情况不算跨域,那我只能起两个不同端口的server了。所以我在本地起了两个基于node的server,但端口分别为3000和3001,来实现跨域。以下就是通过两个端口不一样的服务来测试jsonp解决跨域的方案:

  • server1: localhost:3001,作为响应端
响应端代码:

响应端启动log:


  • server2: localhost:3000,作为请求端
请求端代码:

请求端启动log:


  • 浏览器访问localhost:3000,响应如下:

 
☞下载JSONP例子源码☜
JSONP总结
JSONP实现的原理很简单而且使用jquery的api会非常的方便,只需要配合后台定义好的接口。但是也有缺点,就是只支持GET的请求方式,如果需要使用POST或者传输大量的数据的时候,那我们就只能选择其他方式了,例如下面介绍的CORS。
 
2. CORS
CORS(Cross-Origin Resource Sharing)即跨域资源共享,也是一种实现跨域访问的方法。
CORS的实现原理很简单,只需要在响应端的头信息配置一个Access-Control-Allow-Origin的响应信息即可。

  • a) 没有配置Access-Control-Allow-Origin时,http://localhost:3000向http://localhost:3001发起ajax请求,跨域请求失败。
  • b) 设置Access-Control-Allow-Origin: http://localhost:3000:
响应代码:

请求代码:

浏览器访问http://localhost:3000,响应如下:


  • c) 设置Access-Control-Allow-Origin: *,注意这里的*是指所有来源都可以调用该接口:

请求代码:

浏览器访问http://localhost:3000,响应如下:

☞下载CORS例子源码☜
 
CORS总结
CORS在使用起来非常方便,但也有缺点。

  • ① 兼容性,下图可见,对于需要兼容IE6-7的网站来说,这种方案还是存在着不满足需求的情况。但是对于现代浏览器,特别是在移动端可以放心使用。


  • ② 安全性
CORS提供了一种简易的跨域请求方案,但是并没有为安全访问提供足够的保障机制,例如上面Access-Control-Allow-Origin: *的情况,所有使用者都可以请求改接口,这给服务端带来了巨大的安全隐患。如果需要保障安全,请参考OAuth2。
 
3. postMessage
postMessage是html5引入的message的API,可以更加方便、有效、安全的解决iframe嵌套跨域问题。详情见postMessage使用文档 - MDN。

  • 主页面


  • iframe页面


  • 浏览器访问http://localhost:3000,响应如下:

☞下载postMessage例子源码☜
 
postMessage总结
postMessage使用非常简单,但是在浏览器支持上对于IE6-7存在不足,如下图:

但是现代浏览器对于使用postMessage还是非常有效的,特别是在移动端。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345302-1-1.html 上篇帖子: 【转】nodejs 模块加载 下篇帖子: NodeJs post xml info
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表