`
hongtoushizi
  • 浏览: 379194 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

跨域解决方案(基于nodejs)

阅读更多

转载自:

跨域是web开发过程中经常会遇见的一种问题,因为javascript的同源策略的限制,a.com域名下是无法操作b.com下的对象或者调用接口的。

  • 什么情况算跨域?
request url response url 说明 是否允许通讯
www.a.com/a.js www.a.com/b.js 同一域名 允许
www.a.com/a.js www.a.com:8080/b.js 同一域名,端口不同 不允许
http://www.a.com/a.js https://www.a.com/b.js 同一域名,协议不同 不允许
www.a.com/a.js blog.a.com/b.js 一级域名相同,二级域名不同 不允许
www.a.com/a.js www.b.com/b.js 不同域名 不允许

 

目前解决跨域的方法比较多,通常有iframe、动态创建script、document.domain、flash、jsonp、cors、postMessage这几种。但本文只给出jsonpcorspostMessage三种的测试例子。

 

测试环境

  • 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,作为响应端

响应端代码:

image

响应端启动log:

image

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

请求端代码:

image

请求端启动log:

image

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

image

 

☞下载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

响应代码:

image

请求代码:

image

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

image

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

image

请求代码:

image

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

image

☞下载CORS例子源码☜

 

CORS总结

CORS在使用起来非常方便,但也有缺点。

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

image

  • ② 安全性

CORS提供了一种简易的跨域请求方案,但是并没有为安全访问提供足够的保障机制,例如上面Access-Control-Allow-Origin: *的情况,所有使用者都可以请求改接口,这给服务端带来了巨大的安全隐患。如果需要保障安全,请参考OAuth2

 

3. postMessage

postMessage是html5引入的message的API,可以更加方便、有效、安全的解决iframe嵌套跨域问题。详情见postMessage使用文档 - MDN

  • 主页面

image

  • iframe页面

image

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

image

☞下载postMessage例子源码☜

 

postMessage总结

postMessage使用非常简单,但是在浏览器支持上对于IE6-7存在不足,如下图:

image

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

 

分享到:
评论

相关推荐

    什么是跨域解决方案有哪些.docx

    跨域解决方案有哪些 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。广义的跨域包括资源跳转、资源嵌入、脚本请求等。狭义的跨域是由浏览器同源策略限制的一类请求场景。 同源策略/...

    nodejs搭建本地服务器轻松解决跨域问题

    但在生产环境中,可能需要更复杂的解决方案,比如使用代理服务器或配置CORS策略。 总结来说,通过Node.js搭建本地服务器并配置适当的响应头,可以有效地解决开发阶段的跨域问题。这种方式不仅方便快捷,而且对于...

    基于Nodejs和React hooks实现的知乎日报WebApp系统源码+详细项目说明.zip

    从零开始构建React项目「本项目不采用任何系解决方案(例如:淘系),就是基于最纯正的React实现开发」 1. 基于create-react-app创建工程化项目 $ npm i create-react-app -g $ create-react-app 项目名 --- $ ...

    LAMP人基于nodejs的云端一体实时基础设施设计思路PPT学习课件.pptx

    【LAMP人基于Node.js的云端一体实时基础设施设计思路】主要探讨了在现代Web开发中如何构建一个实时、高效且无缝连接的云端解决方案。LAMP(Linux, Apache, MySQL, PHP)代表了一种传统的Web开发架构,而在这个PPT中...

    nodejs+nodejs-websocket在线实时画布

    WebSocket是一种在客户端和服务器之间建立长连接的协议,为双向通信提供了低延迟、高效的解决方案。在这个实时画布应用中,WebSocket用于实现实时通信,当用户在画布上操作时,客户端会通过WebSocket将坐标信息发送...

    VUE + nodejs实战

    - **跨域问题**:通过Node.js设置CORS策略,解决前后端跨域访问限制。 - **部署**:Node.js应用可以通过PM2等进程管理工具部署到服务器,Vue应用通常构建为静态资源部署到Nginx或Apache等服务器。 4. **CSS与Vue....

    一个仿知乎论坛博客系统 nodejs-express

    "node.js"和"mongodb"则明确指出了项目的技术栈,即Node.js作为后端开发语言,MongoDB作为数据存储解决方案。 【文件】"demo_01"可能代表项目的初始版本或演示版本,包含项目的基本结构和功能实现。此压缩包可能...

    用nodejs实现json和jsonp服务的方法

    而JSONP(JSON with Padding)是为了解决同源策略限制而发明的一种跨域请求技术。这篇文章将详细介绍如何在Node.js环境中实现这两种服务。 首先,我们得了解同源策略。它是由浏览器实施的安全策略,限制了脚本如何...

    StockWatch:用于观看 ASX 股票的 NodeJS 代码

    NodeJS是基于Chrome V8 JavaScript引擎的开源平台,它允许开发者在服务器端使用JavaScript编写代码,提供了一种高效、轻量级且可扩展的解决方案。NodeJS的模块化设计使得开发者能够轻松地重用代码和管理项目依赖。 ...

    websocket的实现

    WebSocket是一种在客户端和服务器之间...总结,WebSocket为实时Web应用提供了解决方案,而`ws`库是Node.js环境中实现WebSocket服务的常用工具。理解其基本原理和使用方法,可以帮助开发者构建高效、实时的网络应用。

    基于vite+vue3+pinia+element-plus+ts后台管理系统源码+项目说明.zip

    vue-element-perfect 是一个后台前端解决方案,它使用了最新的前端技术栈、动态路由,权限验证,并且有着丰富的组件,企业级中后台解决方案,可免费商用,同时支持PC、平板、手机 ## 项目功能 - 使用Vue3.0开发,单...

    nodejs-lightblog:node.js制作的一个轻博客

    本项目"nodejs-lightblog"正是利用了Node.js的这些优势,构建了一个轻量级的博客系统,提供了一个快速搭建个人或小型团队博客的解决方案。 ### 1. Node.js基础 Node.js的核心在于它的非阻塞I/O模型,使得它可以...

    NodeWithRest:使用Rest标准的NodeJS项目

    总结,“NodeWithRest”项目是一个利用Node.js和REST标准构建的Web服务,结合了Express框架、数据库操作、认证机制以及错误处理等关键元素,为开发者提供了一个完整的后端解决方案。通过理解和掌握这些知识点,...

    SpringBlade快速开发手册

    SpringBlade是一个基于SpringCloud微服务架构的企业级解决方案,它由一个商业级项目升级优化而来,采用Java 8 API重构业务代码,并遵循阿里巴巴编码规范。SpringBlade使用的核心技术包括SpringBoot、SpringCloud ...

    Node+OCR实现图像文字识别功能

    Node.js结合OCR技术实现图像文字识别功能涉及多个关键知识...通过以上知识点的讲解,读者可以了解到如何在Node.js环境中搭建支持OCR功能的图像文字识别应用,同时也可以了解到实际操作过程中可能遇到的问题和解决方案。

    node-cors-server:一个测试应用程序,可在简单和复杂的请求场景中帮助说明处于工作状态和非工作状态的CORS

    **Node.js CORS Server** 在Web开发中,CORS(Cross-Origin Resource Sharing)是一种机制,它允许浏览器中...通过运行和修改这个项目,你可以更好地掌握CORS的配置和调试技巧,为实际项目中的跨域问题提供解决方案。

    Node.JS如何实现JWT原理

    Cookie安全性较弱,容易受到CSRF(跨站请求伪造)攻击,且存在跨域问题。Session数据存储在服务器端,对于分布式系统,需要解决Session共享问题,这可能增加复杂性。 3. **JWT定义** JWT全称为Json Web Token,它...

    jwt-auth

    在这个"jwt-auth"项目中,我们看到它结合了Node.js、Express、Mongoose和jsonwebtoken库,构建了一个基于JWT的后端身份验证解决方案。 1. **Node.js**: Node.js是一个开放源代码、跨平台的JavaScript运行环境,它...

    WebsocketChat:使用 websocket 和 node.js 进行简单的浏览器聊天

    WebSocket 是一种在客户端和服务器之间建立长连接的协议,它为实时交互提供了高效、低延迟的解决方案。在传统的 HTTP 协议中,每次通信都需要建立一个新的连接,而在 WebSocket 中,一旦连接建立,双方可以持续地...

Global site tag (gtag.js) - Google Analytics