感谢原博主贡献前端
随着不一样终端(Pad/Mobile/PC)的兴起,对开发人员的要求愈来愈高,纯浏览器端的响应式已经不能知足用户体验的高要求,咱们每每须要针对不一样的终端开发定制的版本。为了提高开发效率,先后端分离的需求愈来愈被重视,后端负责业务/数据接口,前端负责展示/交互逻辑,同一份数据接口,咱们能够定制开发多个版本。 而先后端分离带来的一个问题就是前端web部署的服务器和后端提供服务的服务器大几率不在同一个域名下,进而会产生跨域问题。webpack
若是浏览器支持HTML5,那么就能够一劳永逸地使用新的跨域策略:CORS了。 CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。 了解CORS前,咱们先搞明白概念: Origin表示本域,也就是浏览器当前页面的域。当JavaScript向外域(如sina.com)发起请求后,浏览器收到响应后,首先检查Access-Control-Allow-Origin是否包含本域,若是是,则这次跨域请求成功,若是不是,则请求失败,JavaScript将没法获取到响应的任何数据。nginx
用一个图来表示就是:
这里写图片描述
假设本域是my.com,外域是sina.com,只要响应头Access-Control-Allow-Origin为http://my.com,或者是*,本次请求就能够成功。
可见,跨域可否成功,取决于对方服务器是否愿意给你设置一个正确的Access-Control-Allow-Origin,决定权始终在对方手中。web
上面这种跨域请求,称之为“简单请求”。简单请求包括GET、HEAD和POST(POST的Content-Type类型仅限application/x-www-form-urlencoded、multipart/form-data和text/plain),而且不能出现任何自定义头(例如,X-Custom: 12345),一般能知足90%的需求。npm
不管你是否须要用JavaScript经过CORS跨域请求资源,你都要了解CORS的原理。最新的浏览器全面支持HTML5。在引用外域资源时,除了JavaScript和CSS外,都要验证CORS。json
浏览器确认服务器响应的Access-Control-Allow-Methods头确实包含将要发送的AJAX请求的Method,才会继续发送AJAX,不然,抛出一个错误。后端
因为以POST、PUT方式传送JSON格式的数据在REST中很常见,因此要跨域正确处理POST和PUT请求,服务器端必须正确响应OPTIONS请求。(摘抄自廖雪峰老师的文章)api
须要深刻了解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
}
}
修改启动命令,默认使用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