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中的String对象详谈
Mar 03 Javascript
javascript每日必学之运算符
Feb 16 Javascript
JS中JSON对象和String之间的互转及处理技巧
Apr 06 Javascript
浅谈jQuery双事件多重加载的问题
Oct 05 Javascript
easyUI下拉列表点击事件使用方法
May 18 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
Jun 07 Javascript
jquery使用FormData实现异步上传文件
Oct 25 jQuery
微信小程序http连接访问解决方案的示例
Nov 05 Javascript
基于javascript实现碰撞检测
Mar 12 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
Aug 31 Javascript
JavaScript canvas实现雨滴特效
Jan 10 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
sae使用smarty模板的方法
2013/12/17 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
php session_decode函数用法讲解
2019/05/26 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
如何在Mozilla Gecko 用Javascript加载XSL
2007/01/09 Javascript
Javascript Select操作大集合
2009/05/26 Javascript
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
JavaScript中防止微信浏览器被整体拖动的方法
2017/08/25 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
python关于倒排列的知识点总结
2020/10/13 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
幼儿园消防安全制度
2014/01/26 职场文书
母亲追悼会答谢词
2014/01/27 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
教研活动总结
2014/04/28 职场文书
党支部三会一课计划
2014/09/24 职场文书
2015年预算员工作总结
2015/05/14 职场文书
2016年暑期教师培训心得体会
2016/01/09 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript