angular.js中解决跨域问题的三种方式


Posted in Javascript onJuly 12, 2017

前言

开始本文之前,大家应该首先了解,协议、主机名和端口号相同叫同源。同源策略允许页面从同一个站点加载和执行特定的脚本。站外其他来源的脚本同页面的交互则被严格限制。

要解决这个问题就需要跨域,本文介绍解决angular中的跨域的三种方式:

一、JSONP

JSONP的原理是通过 <script> 标签发起一个GET请求来取代XHR请求。JSONP生成一个<script> 标签并插到DOM中,然后浏览器会接管并向 src 属性所指向的地址发送请求。当服务器返回请求时, 响应结果会被包装成一个JavaScript函数, 并由该请求所对应的回调函数调用。

AngularJS在 $http 服务中提供了一个JSONP辅助函数。 通过 $http 服务的 jsonp 方法可以发送请求,如下所示:

$http
  .jsonp("https://api.github.com?callback=JSON_CALLBACK") .success(function(data) {
  // 数据
  });

因为请求是由 <script> 标签发送的,所以这个方法只能发送GET请求。

二、使用 CORS
CORS规范简单地扩展了标准的XHR对象,以允许JavaScript发送跨域的XHR请求。它会通过预检查(preflight)来确认是否有权限向目标服务器发送请求。预检查可以让服务器接受或拒绝来自全部服务器、特定服务器或一组服务器的请求。这意味着客户端和服务端应用需要协同工作,才能向客户端或服务器发送数据。

首先需要告诉AngularJS我们正在使用CORS。使用 config()方法在应用模块上设置两个参数以达到此目的。

angular.module('myApp', [])
.config(function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers
.common['X-Requested-With'];
});

接下来,需要服务端设置响应头,这个需要和后端人员镜像
Access-Control-Allow-Origin 这个头的值可以是与请求头的值相呼应的值,为*表示允许接收从任何来源发来的请求。
Access-Control-Allow-Credentials 默认情况下,CORS请求不会发送cookie。如果服务器返回了这个头,那么就可以通过将withCredentials 设置为 true 来将cookie同请求一同发送出去。

接下来就可以使用下面的请求进行跨域请求了

$http
.get("https://api.github.com")
.success(function(data) {
// 数据
});

三、服务器端代理这种方式更多的应该是后端来做的实现向所有服务器发送请求的最简单方式是使用服务器端代理。

这个服务器和页面处在同一个域中(或者不在同一个域中但支持CORS) ,做为所有远程资源的代理。可以简单地通过使用本地服务器来代替客户端向外部资源发送请求, 并将响应结果返回给客户端。通过这种方式,老式浏览器不必使用需要发送额外请求的CORS(只有现代浏览器支持CORS)也能发送跨域请求,并且可以在浏览器中采用标准的安全策略。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
srcElement表格样式
Sep 03 Javascript
Javascript实例教程(19) 使用HoTMetal(6)
Dec 23 Javascript
jQuery中scrollLeft()方法用法实例
Jan 16 Javascript
JavaScript获取元素尺寸和大小操作总结
Feb 27 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
Mar 08 Javascript
BooStrap对导航条的改造实践小结
Sep 21 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
Nov 04 Javascript
使用JS组件实现带ToolTip验证框的实例代码
Aug 23 Javascript
jquery中有哪些api jQuery主要API
Nov 20 jQuery
JavaScript 2018 中即将迎来的新功能
Sep 21 Javascript
jqGrid表格底部汇总、合计行footerrow处理
Aug 21 Javascript
element-ui如何防止重复提交的方法步骤
Dec 09 Javascript
JavaScript+HTML5实现的日期比较功能示例
Jul 12 #Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
Jul 12 #Javascript
Bootstrap提示框效果的实例代码
Jul 12 #Javascript
JavaScript输出所选择起始与结束日期的方法
Jul 12 #Javascript
微信小程序三级联动地址选择器的实例代码
Jul 12 #Javascript
微信小程序 共用变量值的实现
Jul 12 #Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
Jul 12 #Javascript
You might like
星际争霸中的对战模式介绍
2020/03/04 星际争霸
SONY ICF-F10中波修复记
2021/03/02 无线电
3.从实例开始
2006/10/09 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
Active控件问题小结(附解决办法)
2016/06/09 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
Python求出0~100以内的所有素数
2018/01/23 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
Python3解释器知识点总结
2019/02/19 Python
python分布式计算dispy的使用详解
2019/12/22 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
python与pycharm有何区别
2020/07/01 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
大学生职业生涯规划范文
2013/12/31 职场文书
早餐连锁店计划书
2014/01/08 职场文书
缴纳养老保险的证明
2014/01/10 职场文书
大学生自荐信范文
2015/03/05 职场文书
物业保洁员管理制度
2015/08/05 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
golang操作rocketmq的示例代码
2022/04/06 Golang
python中的random模块和相关函数详解
2022/04/22 Python