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 写类方式之二
Jul 05 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
Mar 12 Javascript
根据当前时间在jsp页面上显示上午或下午
Aug 18 Javascript
jQuery中cookie插件用法实例分析
Dec 04 Javascript
AngularJS初始化静态模板详解
Jan 14 Javascript
bootstrap模态框实现拖拽效果
Dec 14 Javascript
webpack项目调试以及独立打包配置文件的方法
Feb 28 Javascript
koa-router源码学习小结
Sep 07 Javascript
vue 实现超长文本截取,悬浮框提示
Jul 29 Javascript
Vue中computed及watch区别实例解析
Aug 01 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
Aug 07 jQuery
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
Sep 04 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高级对象构建 多个构造函数的使用
2012/02/05 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
javaScript 页面自动加载事件详解
2014/02/10 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
跟老齐学Python之正规地说一句话
2014/09/28 Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
Django rest framework实现分页的示例
2018/05/24 Python
由面试题加深对Django的认识理解
2019/07/19 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
事务机电主管工作职责
2014/02/25 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
司法局火灾防控方案
2014/06/05 职场文书
投诉信回复范文
2015/07/03 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书
MySQL的安装与配置详细教程
2021/06/26 MySQL
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis