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 相关文章推荐
js玩一玩WSH吧
Feb 23 Javascript
热点新闻滚动特效的js代码
Aug 17 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
Sep 25 Javascript
javascript使用call调用微信API
Dec 15 Javascript
jQuery验证插件validate使用详解
May 11 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
JavaScript中子对象访问父对象的方式详解
Sep 01 Javascript
浅谈js的ajax的异步和同步请求的问题
Oct 07 Javascript
微信小程序 toast 详解及实例代码
Nov 09 Javascript
Vue常用指令V-model用法
Mar 08 Javascript
在 Vue 中编写 SVG 图标组件的方法
Feb 24 Javascript
Element Notification通知的实现示例
Jul 27 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
追求程序速度,而不是编程的速度
2008/04/23 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
YII框架常用技巧总结
2019/04/27 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
js 获取Listbox选择的值的代码
2010/04/15 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python正则表达式教程之一:基础篇
2017/03/02 Python
Python随机读取文件实现实例
2017/05/25 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
销售自荐信
2013/10/22 职场文书
会计应届生的自荐信
2013/12/13 职场文书
草船借箭教学反思
2014/02/03 职场文书
心理健康课教学反思
2014/02/13 职场文书
合作协议书
2014/04/23 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
一文搞懂redux在react中的初步用法
2021/06/09 Javascript
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android