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编程起步(第二课)
Feb 27 Javascript
传智播客学习之JavaScript基础篇
Nov 13 Javascript
js jquery验证银行卡号信息正则学习
Jan 21 Javascript
详解基于Bootstrap扁平化的后台框架Ace
Nov 27 Javascript
js正则表达式注册页面表单验证
Oct 11 Javascript
探究JavaScript中的五种事件处理程序方式
Dec 07 Javascript
简单实现jQuery级联菜单
Jan 09 Javascript
基于jQuery实现咖啡订单管理简单应用
Feb 10 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
关于javascript sort()排序你可能忽略的一点理解
Jul 18 Javascript
javascript canvas封装动态时钟
Sep 30 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
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&amp;java(三)
2006/10/09 PHP
使用PHP的日期与时间函数技巧
2008/04/24 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
php-fpm中max_children的配置
2019/03/15 PHP
javascript学习笔记(五)正则表达式
2011/04/08 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
python搭建微信公众平台
2016/02/09 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
Python中django学习心得
2017/12/06 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
python conda操作方法
2019/09/11 Python
python实现加密的方式总结
2020/01/19 Python
详解Anaconda 的安装教程
2020/09/23 Python
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
车间调度岗位职责
2013/11/30 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
高二学生评语大全
2014/04/25 职场文书
2014年药店工作总结
2014/11/20 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript