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

原创 2017年06月17日 15:58:05

1.跨域请求产生

随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本。为了提升开发效率,前后端分离的需求越来越被重视,后端负责业务/数据接口,前端负责展现/交互逻辑,同一份数据接口,我们可以定制开发多个版本。
而前后端分离带来的一个问题就是前端web部署的服务器和后端提供服务的服务器大概率不在同一个域名下,进而会产生跨域问题。

2.通用解决方案

如果浏览器支持HTML5,那么就可以一劳永逸地使用新的跨域策略:CORS了。
CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。
了解CORS前,我们先搞明白概念:
Origin表示本域,也就是浏览器当前页面的域。当JavaScript向外域(如sina.com)发起请求后,浏览器收到响应后,首先检查Access-Control-Allow-Origin是否包含本域,如果是,则此次跨域请求成功,如果不是,则请求失败,JavaScript将无法获取到响应的任何数据。

用一个图来表示就是:
这里写图片描述
假设本域是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

版权声明:本文为博主原创文章,未经博主允许不得转载。

Angular开发(十四)-利用angular的http转发、即代理http 请求,处理项目中请求跨域的问题

虽然angular的http请求中提供了jsonp处理跨域问题,但是不常用,我们web服务器端可能会选择别的方式处理web服务器端使用nginx进行反向代理处理 使用nodejs中node-http-...

Angular 2 + 折腾记 :(1)初识Angular-cli[官方脚手架]及脱坑要点

什么是Angular-cli简言之:就是NG团队自行维护的一个`脚手架`[内置单元测试及webpack2打包工具等]...
  • bomess
  • bomess
  • 2017年03月17日 11:40
  • 5390

angular2的angular-cli如何使用代理api

angular-cli 启动angular2项目后的地址一般是http://localhost:4200 这里用的spring-boot的后台服务,本地端口是8080 如果在anguar项目中...

AngularJS实现跨域请求

跨域,前端开发中经常遇到的问题,AngularJS实现跨域方式类似于Ajax,使用CORS机制。 下面阐述一下AngularJS中使用$http实现跨域请求数据。 AngularJS XMLHttp...
  • jumtre
  • jumtre
  • 2015年11月12日 00:57
  • 27420

Angular4项目解决跨域问题

跨域 跨域: 浏览器对于javascript的同源策略的限制,例如a.cn下面的js不能调用b.cn中的js,对象或数据(因为a.cn和b.cn是不同域),所以跨域就出现了. 上面提到的,同域的...

angularJs 解决跨域访问问题

方法:使用$http.jsonp()方式 注意:  请求值必须加上:callback=JSON_CALLBACK 例: $http.jsonp('http://api.map...

Angularjs 跨域请求

最近在做个项目,启用了Angularjs作为前端框架,后端则使用java服务端,引入了shiro框架作为权限管理。 理想是丰满的,现实是骨感的。 起先单域测试下一切Ok,进行二级域名跨域测试就出现...
  • hj7jay
  • hj7jay
  • 2016年06月27日 12:33
  • 1616

angular 使用$http.jsonp进行跨域访问以及修改目标JSON

昨天把皮皮书屋的遗产书籍整理好了,做了个AngularJs 的SAP, 上传到了阿里云, 主要思路是使用把皮皮书屋的xls内容转化成了JSON,然后用$http.get直接拿到数据,然后用ui-gri...

angular2 使用更改默认端口,并配置proxy.config.json进行跨域访问

在项目根目录新建proxy.config.json 文件 proxy.config.json { "/api": { "target": "http://127.0.0.1:8081...

angularjs解决跨域问题

首先我来声明一下“跨域”这个问题都有哪些类型: 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(ifra...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于angular-cli配置代理解决跨域请求问题
举报原因:
原因补充:

(最多只允许输入30个字)