详解基于angular-cli配置代理解决跨域请求问题


Posted in Javascript onJuly 05, 2017

1.跨域请求产生

随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本。为了提升开发效率,前后端分离的需求越来越被重视,后端负责业务/数据接口,前端负责展现/交互逻辑,同一份数据接口,我们可以定制开发多个版本。

而前后端分离带来的一个问题就是前端web部署的服务器和后端提供服务的服务器大概率不在同一个域名下,进而会产生跨域问题。

2.通用解决方案

如果浏览器支持HTML5,那么就可以一劳永逸地使用新的跨域策略:CORS了。

CORS全称Cross-Origin Resource Sharing,是html5规范定义的如何跨域访问资源。

了解CORS前,我们先搞明白概念:

Origin表示本域,也就是浏览器当前页面的域。当JavaScript向外域(如sina.com)发起请求后,浏览器收到响应后,首先检查Access-Control-Allow-Origin是否包含本域,如果是,则此次跨域请求成功,如果不是,则请求失败,javascript将无法获取到响应的任何数据。

用一个图来表示就是:

详解基于angular-cli配置代理解决跨域请求问题

假设本域是my.com,外域是sina.com,只要响应头Access-Control-Allow-Origin为http://my.com,或者是*,本次请求就可以成功。

可见,跨域能否成功,取决于对方服务器是否愿意给你设置一个正确的Access-Control-Allow-Origin,决定权始终在对方手中。

上面这种跨域请求,称之为“简单请求”。简单请求包括GET、HEAD和POST(POST的Content-Type类型仅限application/x-www-form-urlencoded、multipart/form-data和text/plain),并且不能出现任何自定义头(例如,X-Custom: 12345),通常能满足90%的需求。

无论你是否需要用JavaScript通过CORS跨域请求资源,你都要了解CORS的原理。最新的浏览器全面支持Html5。在引用外域资源时,除了JavaScript和CSS外,都要验证CORS。

浏览器确认服务器响应的Access-Control-Allow-Methods头确实包含将要发送的AJAX请求的Method,才会继续发送AJAX,否则,抛出一个错误。

由于以POST、PUT方式传送JSON格式的数据在REST中很常见,所以要跨域正确处理POST和PUT请求,服务器端必须正确响应OPTIONS请求。

需要深入了解CORS的童鞋请移步W3C文档。

3.angular-cli代理配置解决跨域请求问题

使用CORS的确是可以很好的解决跨域问题,但是需要后端开发人员配合,如果想在不修改后端代码的前提下解决问题,配置代理绝对是不二选择。

使用tomcat、nginx…配置代理当然可以,但是麻烦,需要先打包代码再部署到nginx(或者其他)中,才能测试使用,为了保证开发效率,我们希望代码能够即写即测,这时在angular-cli中配置代理的优势就先露无疑。

在angular的开发中,angular-cli非常的方便,强烈推荐使用,今天我们主要讲述一下angular-cli如何通过配置代理解决跨域请求问题。

需要了解angular-cli的童鞋请移步angular-cli 官方文档

假如你现在已经使用angular-cli构建你的项目,并且程序正常运行,那么我们现在开始配置cli的代理:

1.首先我们创建代理配置文件proxy.conf.json

假如你的后端服务的访问地址为“10.4.60.200:8080”,以下为proxy.conf.json的例子:

{
 "/api": {
 "target": "http://10.4.60.200:8080",
 "secure": false
 }
}

2.改写package.json

修改启动命令,默认使用npm start时使用代理文件配置的代理

"start": "ng serve --proxy-config proxy.conf.json",

此时此刻当你再使用npm strat启动angular项目时,代理已经配置好了,我们还是以上面的服务url为例,如果原先你需要访问http://10.4.60.200:8080/api/server获取服务,那么现在你只需要把代码中的“10.4.60.200:8080”改为“localhost:4200”即可(cli默认端口为4200,根据自己的启动端口编写)。

此时你的所有服务请求在浏览器看来都是同域请求,不再存在跨域问题,上面所讲只是一个简单的例子,代理有很多参数可以选择配置,例如在代理时对cookie重写可以写为”cookieDomainRewrite”:”localhost”。

更多更详细的代理配置可以参考webpack-dev-server proxy settings

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
浏览器常用高宽的jquery插件
Feb 24 Javascript
直接拿来用的15个jQuery代码片段
Sep 23 Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 Javascript
基于ajax与msmq技术的消息推送功能实现代码
Dec 26 Javascript
JavaScript代码执行的先后顺序问题
Oct 29 Javascript
Vue使用NPM方式搭建项目
Oct 25 Javascript
解决vue打包后vendor.js文件过大问题
Jul 03 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
Aug 16 Javascript
JQuery 实现文件下载的常用方法分析
Oct 29 jQuery
JS中数组实现代码(倒序遍历数组,数组连接字符串)
Dec 29 Javascript
vue开发移动端底部导航条功能
Apr 08 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
Nov 05 Javascript
微信小程序学习之数据处理详解
Jul 05 #Javascript
用node和express连接mysql实现登录注册的实现代码
Jul 05 #Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 #Javascript
jQuery使用ajax_动力节点Java学院整理
Jul 05 #jQuery
jQuery扩展_动力节点Java学院整理
Jul 05 #jQuery
jQuery选择器_动力节点Java学院整理
Jul 05 #jQuery
jQuery事件_动力节点Java学院整理
Jul 05 #jQuery
You might like
Zend Framework基本页面布局分析
2016/03/19 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
php 常用的系统函数
2017/02/07 PHP
PDO::errorInfo讲解
2019/01/28 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python 遍历列表提取下标和值的实例
2018/12/25 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
办公室内勤工作职责
2013/12/11 职场文书
党员教师工作决心书
2014/03/13 职场文书
道德之星事迹材料
2014/05/03 职场文书
临时租车协议范本
2014/09/23 职场文书
2015年项目工作总结
2015/04/29 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
Redis如何一键部署脚本
2021/04/12 Redis