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关闭当前页面(窗口)不带任何提示
Mar 26 Javascript
div失去焦点事件实现思路
Apr 22 Javascript
jQuery获取checkboxlist的value值的方法
Sep 27 Javascript
JS表格组件神器bootstrap table详解(基础版)
Dec 08 Javascript
Vue2.0组件间数据传递示例
Mar 07 Javascript
浅析Angular2子模块以及异步加载
Apr 24 Javascript
微信小程序 上传头像的实例详解
Oct 27 Javascript
layui select获取自定义属性方法
Aug 15 Javascript
在vue项目中集成graphql(vue-ApolloClient)
Sep 08 Javascript
Vue动态路由缓存不相互影响的解决办法
Feb 19 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
Jul 23 Javascript
token 机制和实现方式
Dec 15 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
smarty模板数学运算示例
2016/12/11 PHP
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
js面向对象编程总结
2017/02/16 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
Python中的默认参数实例分析
2018/01/29 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
pytorch 数据集图片显示方法
2018/07/26 Python
详解python播放音频的三种方法
2019/09/23 Python
幼师求职自荐信
2014/05/31 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
创业计划书之面包店
2019/09/12 职场文书
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript