AngularJS实现的JSONP跨域访问数据传输功能详解

发布时间 - 2026-01-11 02:25:47    点击率:

本文实例讲述了AngularJS实现的JSONP跨域访问数据传输功能。分享给大家供大家参考,具体如下:

大家会自然想到只有一个字母之差的JSON吧~

JSON(JavaScript Object Notation)JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不是一回事儿

JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议。我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的“暗号”,而JSONP则是把用暗号书写的情报传递给自己同志时使用的接头方式。看到没?一个是描述信息的格式,一个是信息传递双方约定的方法。

浏览器是存在同源策略这个机制的,在全局层面禁止了页面加载或执行与自身来源不同的域的任何脚本。

JSONP是一种可以绕过浏览器的安全限制,从不同的域请求数据的方法。

Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>);

如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;JSON的纯字符数据格式可以简洁的描述复杂数据,被js原生支持,所以在web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

JSONP的原理是通过<script>标签发起一个GET请求来取代XHR请求。JSONP生成一个<script>标签并插到DOM中,然后浏览器会接管并向src属性所指向的地址发送请求。

当服务器返回请求时,响应结果会被包装成一个JavaScript函数,并由该请求所对应的回调函数调用。

AngularJS在http服务中提供了一个JSONP辅助函数。通过http服务中提供了一个JSONP辅助函数。通过http服务的jsonp方法可以发送请求,如下所示:

$http .jsonp("https://api.github.com?callback=JSON_CALLBACK") .success(function(data) {
 // 数据
});

当请求被发送时,AngularJS会在DOM中生成一个如下所示的<script>标签:

<script src="https://api.github.com?callback=angular.callbacks._0" type="text/javascript"></script>

注意,JSON_CALLBACK被替换成了一个特地为此请求生成的自定义函数。当支持JSOPN的服务器返回数据时,数据会被包装在由AngularJS生成的具名函数angular.callbacks._0中在这个例子中,GitHub服务器会返回包含在回调函数中的JSON数据,响应看起来如下所示: 

// 简写
angular.callbacks._0({
  'meta': {
   'X-RateLimit-Limit': '60',
   'status': 200
  },
  'data': {
   'current_user_url': 'https://api.github.com/user'
  }
})

当AngularJS调用指定的回调函数时会对$http的promise对象进行resolve。当我们自己开发支持JSONP的后端服务时,要确保响应的数据被包含在请求所指定的回调函数中。使用JSONP需要意识到潜在的安全风险。首先,服务器会完全开放,允许后端服务调用应用中的任何JavaScript。不受我们控制的外部站点(或者蓄意攻击者)可以随时更改脚本,使我们的整个站点变得脆弱。服务器或中间人有可能会将额外的JavaScript逻辑返回给页面,从而将用户的隐私数据暴露出来。由于请求是由<script>标签发送的,所以只能通过JSONP发送GET请求。并且脚本的异常也很难处理。使用JSONP一定要谨慎,同时只跟信任并可以控制的服务器进行通信。

一句话就是利用script标签绕过同源策略,获得一个类似这样的数据,jsonpcallback是页面存在的回调方法,参数就是想得到的json。

Jquery中jsonp的使用

myUrl = "http://localhost:8090/api/test";
$.ajax({
 type:"GET",
 url:myUrl,
 dataType:"jsonp",
 jsonp:"callback",
 jsonpCallback:"jsonpCallback",
 success:function(data){
  alert(data.msg);
 }
});
function jsonpCallback(data){
 alert(data);
}

1.jsonp只能使用get请求,解决同源问题,返回javascript代码,因为请求javascript文件是没有同源问题的。
2.当请求数据类型为jsonp时,会将callback=jsonpCallback加在url上,http://localhost:8090/api/testcallback=jsonpCallback
3.前台javascript中定义jsonpCallback函数,此函数必须定义在window下,也就是全局的函数,否则找不到。
4.后台获取请求的callback参数值jsonpCallback,返回字符串"jsonpCallback(result)",result为返回结果。
5.请求返回的是script tag,首先会调用jsonpCallback函数,不管是否找到该函数,都会调用success函数。
6.如果没有定义jsonp和jsonpCallback,jsonp默认为"callback",jsonpCallback会是Jquery自动生成的函数名。

angularJS中jsonp的使用

myUrl = "http://localhost:8090/api/test?callback=JSON_CALLBACK";
$http.jsonp(myUrl).success(
 function(data){
  alert(data);
 }
);

1.angularJS中使用$http.jsonp函数
2.指定callback和回调函数名,函数名为JSON_CALLBACK时,会调用success回调函数,JSON_CALLBACK必须全为大写。
3.也可以指定其它回调函数,但必须是定义在window下的全局函数。
4.url中必须加上callback
5.当callback为JSON_CALLBACK时,只会调用success,即使window中有JSON_CALLBACK函数,也不会调用该函数。

更多关于AngularJS相关内容感兴趣的读者可查看本站专题:《AngularJS指令操作技巧总结》、《AngularJS入门与进阶教程》及《AngularJS MVC架构总结》

希望本文所述对大家AngularJS程序设计有所帮助。


# AngularJS  # JSONP  # 跨域访问  # 数据传输  # Angular CLI发布路径的配置项浅析  # Angular4实现图片上传预览路径不安全的问题解决  # angular2 ng build部署后base文件路径问题详细解答  # Angular.JS去掉访问路径URL中的#号详解  # Angular 项目路径添加指定的访问前缀  # 回调  # 是一种  # 客户端  # 所示  # 服务端  # 不受  # 只有一个  # 会将  # 自己的  # 装进  # 的是  # 后端  # 进阶  # 器上  # 是在  # 成了  # 相关内容  # 在这个  # 那就  # 很难 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速重置建站主机并恢复默认配置?  如何在宝塔面板中修改默认建站目录?  PythonWeb开发入门教程_Flask快速构建Web应用  使用豆包 AI 辅助进行简单网页 HTML 结构设计  JavaScript模板引擎Template.js使用详解  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  ,怎么在广州志愿者网站注册?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  想要更高端的建设网站,这些原则一定要坚持!  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  香港服务器网站推广:SEO优化与外贸独立站搭建策略  高端云建站费用究竟需要多少预算?  ,在苏州找工作,上哪个网站比较好?  详解CentOS6.5 安装 MySQL5.1.71的方法  微信小程序 配置文件详细介绍  Android okhttputils现在进度显示实例代码  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  韩国服务器如何优化跨境访问实现高效连接?  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  如何在橙子建站中快速调整背景颜色?  大同网页,大同瑞慈医院官网?  新三国志曹操传主线渭水交兵攻略  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel如何使用Blade组件和插槽?(Component代码示例)  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  音响网站制作视频教程,隆霸音响官方网站?  如何为不同团队 ID 动态生成多个非值班状态按钮  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何在万网利用已有域名快速建站?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  如何在IIS中新建站点并配置端口与物理路径?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Android利用动画实现背景逐渐变暗  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  jQuery中的100个技巧汇总  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel如何升级到最新版本?(升级指南和步骤)  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  高性价比服务器租赁——企业级配置与24小时运维服务  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  如何用PHP工具快速搭建高效网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何快速上传建站程序避免常见错误?  如何在万网ECS上快速搭建专属网站?  Bootstrap整体框架之CSS12栅格系统