详解基于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插件处理mouseover时内部有子元素时发生样式闪烁
Dec 08 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
Aug 19 Javascript
JavaScript 作用域链解析
Nov 13 Javascript
js实现键盘Enter键提交表单的方法
May 27 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
May 26 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
Jun 25 Javascript
基于vue.js实现侧边菜单栏
Mar 20 Javascript
JS通过调用微信API实现微信支付功能的方法示例
Jun 29 Javascript
Vue2路由动画效果的实现代码
Jul 10 Javascript
详解react-native-fs插件的使用以及遇到的坑
Sep 12 Javascript
Vue中v-for的数据分组实例
Mar 07 Javascript
vue.js层叠轮播效果的实例代码
Nov 08 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
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
jQuery 页面 Mask实现代码
2010/01/09 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
python的random模块及加权随机算法的python实现方法
2017/01/04 Python
Python实现的科学计算器功能示例
2017/08/04 Python
EM算法的python实现的方法步骤
2018/01/02 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
python多线程同步之文件读写控制
2021/02/25 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python接收手机短信的代码整理
2020/08/02 Python
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
广告学毕业生求职信
2014/01/30 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
吨的认识教学反思
2014/04/27 职场文书
小学数学课题方案
2014/06/15 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书