详解基于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 相关文章推荐
[转]JS宝典学习笔记
Feb 07 Javascript
json数据的列循环示例
Sep 06 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
Jan 05 Javascript
详解javascript事件绑定使用方法
Oct 20 Javascript
AngularJS ng-template寄宿方式用法分析
Nov 07 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
Dec 08 Javascript
微信小程序 特效菜单抽屉效果实例代码
Jan 11 Javascript
详解Node.js access_token的获取、存储及更新
Jun 20 Javascript
ES6 Set结构的应用实例分析
Jun 26 Javascript
vue.js实现左边导航切换右边内容
Oct 21 Javascript
详解微信小程序之提高应用速度小技巧
Jan 07 Javascript
js表达式与运算符简单操作示例
Feb 15 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
2018/05/03 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
python显示生日是星期几的方法
2015/05/27 Python
python随机取list中的元素方法
2018/04/08 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
python3让print输出不换行的方法
2020/08/24 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
保研推荐信
2014/05/09 职场文书
python OpenCV学习笔记
2021/03/31 Python
深入浅析React中diff算法
2021/05/19 Javascript
Log4j.properties配置及其使用
2021/08/02 Java/Android
TS 类型兼容教程示例详解
2022/09/23 Javascript