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 相关文章推荐
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
Feb 04 Javascript
javascript计时器事件使用详解
Jan 07 Javascript
用JavaScript实现使用鼠标画线的示例代码
Aug 19 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
Sep 16 Javascript
js图片上传前预览功能(兼容所有浏览器)
Aug 24 Javascript
原生和jQuery的ajax用法详解
Jan 23 Javascript
jQuery滚动监听实现商城楼梯式导航效果
Mar 06 Javascript
JavaScript实现简单的树形菜单效果
Jun 23 Javascript
vue元素实现动画过渡效果
Jul 01 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
Nov 28 Javascript
小程序中canvas的drawImage方法参数使用详解
Jul 04 Javascript
vue调用本地摄像头实现拍照功能
Aug 14 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
php 什么是PEAR?(第二篇)
2009/03/19 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
php利用curl抓取新浪微博内容示例
2014/04/27 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
javascript网页关键字高亮代码
2008/07/30 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
2015/10/29 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
Python 中的 else详解
2016/04/23 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
浅谈python之新式类
2018/08/12 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
scrapy-splash简单使用详解
2021/02/21 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
恶意软件的定义
2014/11/12 面试题
电子邮箱格式怎么写
2014/01/12 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
公司股份合作协议书
2014/12/07 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL