转载自:
跨域是web开发过程中经常会遇见的一种问题,因为javascript的同源策略的限制,a.com域名下是无法操作b.com下的对象或者调用接口的。
- 什么情况算跨域?
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这几种。但本文只给出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实现的原理很简单而且使用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在使用起来非常方便,但也有缺点。
- ① 兼容性,下图可见,对于需要兼容IE6-7的网站来说,这种方案还是存在着不满足需求的情况。但是对于现代浏览器,特别是在移动端可以放心使用。
- ② 安全性
CORS提供了一种简易的跨域请求方案,但是并没有为安全访问提供足够的保障机制,例如上面Access-Control-Allow-Origin: *
的情况,所有使用者都可以请求改接口,这给服务端带来了巨大的安全隐患。如果需要保障安全,请参考OAuth2。
3. postMessage
postMessage是html5引入的message的API,可以更加方便、有效、安全的解决iframe嵌套跨域问题。详情见postMessage使用文档 - MDN。
- 主页面
- iframe页面
- 浏览器访问http://localhost:3000,响应如下:
postMessage总结
postMessage使用非常简单,但是在浏览器支持上对于IE6-7存在不足,如下图:
但是现代浏览器对于使用postMessage还是非常有效的,特别是在移动端。
相关推荐
跨域解决方案有哪些 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。广义的跨域包括资源跳转、资源嵌入、脚本请求等。狭义的跨域是由浏览器同源策略限制的一类请求场景。 同源策略/...
但在生产环境中,可能需要更复杂的解决方案,比如使用代理服务器或配置CORS策略。 总结来说,通过Node.js搭建本地服务器并配置适当的响应头,可以有效地解决开发阶段的跨域问题。这种方式不仅方便快捷,而且对于...
从零开始构建React项目「本项目不采用任何系解决方案(例如:淘系),就是基于最纯正的React实现开发」 1. 基于create-react-app创建工程化项目 $ npm i create-react-app -g $ create-react-app 项目名 --- $ ...
【LAMP人基于Node.js的云端一体实时基础设施设计思路】主要探讨了在现代Web开发中如何构建一个实时、高效且无缝连接的云端解决方案。LAMP(Linux, Apache, MySQL, PHP)代表了一种传统的Web开发架构,而在这个PPT中...
WebSocket是一种在客户端和服务器之间建立长连接的协议,为双向通信提供了低延迟、高效的解决方案。在这个实时画布应用中,WebSocket用于实现实时通信,当用户在画布上操作时,客户端会通过WebSocket将坐标信息发送...
- **跨域问题**:通过Node.js设置CORS策略,解决前后端跨域访问限制。 - **部署**:Node.js应用可以通过PM2等进程管理工具部署到服务器,Vue应用通常构建为静态资源部署到Nginx或Apache等服务器。 4. **CSS与Vue....
"node.js"和"mongodb"则明确指出了项目的技术栈,即Node.js作为后端开发语言,MongoDB作为数据存储解决方案。 【文件】"demo_01"可能代表项目的初始版本或演示版本,包含项目的基本结构和功能实现。此压缩包可能...
而JSONP(JSON with Padding)是为了解决同源策略限制而发明的一种跨域请求技术。这篇文章将详细介绍如何在Node.js环境中实现这两种服务。 首先,我们得了解同源策略。它是由浏览器实施的安全策略,限制了脚本如何...
NodeJS是基于Chrome V8 JavaScript引擎的开源平台,它允许开发者在服务器端使用JavaScript编写代码,提供了一种高效、轻量级且可扩展的解决方案。NodeJS的模块化设计使得开发者能够轻松地重用代码和管理项目依赖。 ...
WebSocket是一种在客户端和服务器之间...总结,WebSocket为实时Web应用提供了解决方案,而`ws`库是Node.js环境中实现WebSocket服务的常用工具。理解其基本原理和使用方法,可以帮助开发者构建高效、实时的网络应用。
vue-element-perfect 是一个后台前端解决方案,它使用了最新的前端技术栈、动态路由,权限验证,并且有着丰富的组件,企业级中后台解决方案,可免费商用,同时支持PC、平板、手机 ## 项目功能 - 使用Vue3.0开发,单...
本项目"nodejs-lightblog"正是利用了Node.js的这些优势,构建了一个轻量级的博客系统,提供了一个快速搭建个人或小型团队博客的解决方案。 ### 1. Node.js基础 Node.js的核心在于它的非阻塞I/O模型,使得它可以...
总结,“NodeWithRest”项目是一个利用Node.js和REST标准构建的Web服务,结合了Express框架、数据库操作、认证机制以及错误处理等关键元素,为开发者提供了一个完整的后端解决方案。通过理解和掌握这些知识点,...
SpringBlade是一个基于SpringCloud微服务架构的企业级解决方案,它由一个商业级项目升级优化而来,采用Java 8 API重构业务代码,并遵循阿里巴巴编码规范。SpringBlade使用的核心技术包括SpringBoot、SpringCloud ...
Node.js结合OCR技术实现图像文字识别功能涉及多个关键知识...通过以上知识点的讲解,读者可以了解到如何在Node.js环境中搭建支持OCR功能的图像文字识别应用,同时也可以了解到实际操作过程中可能遇到的问题和解决方案。
**Node.js CORS Server** 在Web开发中,CORS(Cross-Origin Resource Sharing)是一种机制,它允许浏览器中...通过运行和修改这个项目,你可以更好地掌握CORS的配置和调试技巧,为实际项目中的跨域问题提供解决方案。
Cookie安全性较弱,容易受到CSRF(跨站请求伪造)攻击,且存在跨域问题。Session数据存储在服务器端,对于分布式系统,需要解决Session共享问题,这可能增加复杂性。 3. **JWT定义** JWT全称为Json Web Token,它...
在这个"jwt-auth"项目中,我们看到它结合了Node.js、Express、Mongoose和jsonwebtoken库,构建了一个基于JWT的后端身份验证解决方案。 1. **Node.js**: Node.js是一个开放源代码、跨平台的JavaScript运行环境,它...
WebSocket 是一种在客户端和服务器之间建立长连接的协议,它为实时交互提供了高效、低延迟的解决方案。在传统的 HTTP 协议中,每次通信都需要建立一个新的连接,而在 WebSocket 中,一旦连接建立,双方可以持续地...