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 相关文章推荐
再谈querySelector和querySelectorAll的区别与联系
Apr 20 Javascript
js中iframe调用父页面的方法
Oct 30 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
Nov 05 Javascript
js实现日期显示的一些操作(实例讲解)
Jul 27 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
Jul 21 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
Oct 23 Javascript
原生JS实现随机点名项目的实例代码
Apr 30 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
Jun 27 Javascript
解决layui laydate 时间控件一闪而过的问题
Sep 28 Javascript
JavaScript闭包相关知识解析
Oct 19 Javascript
Vue如何实现监听组件原生事件
Jul 03 Javascript
Js跳出两级循环方法代码实例
Sep 22 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
php使用Imagick生成图片的方法
2015/07/31 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
jquery获取input表单值的代码
2010/04/19 Javascript
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
Angular 页面跳转时传参问题
2016/08/01 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
Vue中&quot;This dependency was not found&quot;问题的解决方法
2018/06/19 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python字典get()方法用法分析
2015/04/17 Python
python清除字符串里非字母字符的方法
2015/07/02 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
Python中的流程控制详解
2021/02/18 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
什么是事务?事务有哪些性质?
2012/03/11 面试题
简历中的自我评价怎么写
2014/01/29 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
求职意向书范本
2015/05/11 职场文书
法院答辩状格式
2015/05/22 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python