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 相关文章推荐
用Jquery重写windows.alert方法实现思路
Apr 03 Javascript
javascript实现连续赋值
Aug 10 Javascript
跟我学习javascript的arguments对象
Nov 16 Javascript
Angularjs material 实现搜索框功能
Mar 08 Javascript
jQuery点击其他地方时菜单消失的实现方法
Apr 22 Javascript
JS iFrame加载慢怎么解决
May 13 Javascript
批量下载对路网图片并生成html的实现方法
Jun 07 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
Aug 01 Javascript
浅谈js中字符和数组一些基本算法题
Aug 15 Javascript
微信小程序实现张图片合成为一张并下载
Jul 16 Javascript
json_decode 索引为数字时自动排序问题解决方法
Mar 28 Javascript
jquery实现淡入淡出轮播图效果
Dec 13 jQuery
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中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
深入理解JavaScript系列(35):设计模式之迭代器模式详解
2015/03/03 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
浅谈Node.js:Buffer模块
2016/12/05 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
Vue性能优化的方法
2020/07/30 Javascript
Python中的fileinput模块的简单实用示例
2015/07/09 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
Python ckeditor富文本编辑器代码实例解析
2020/06/22 Python
浅析python实现动态规划背包问题
2020/12/31 Python
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
恒华伟业笔试面试题
2015/02/26 面试题
最新创业融资计划书
2014/01/19 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
中学生逃课检讨书
2015/02/17 职场文书
九九重阳节致辞
2015/07/31 职场文书
如何用python反转图片,视频
2021/04/24 Python
【海涛DOTA】D-cup邀请赛NV.cn vs DT.Love
2022/04/01 DOTA