出于对网站安全性的要求,两个不同域名的网站之间是不能通过前端技术互相发送请求的。但有时我们又需要使用这样的机制。比如:网站需要制作一个天气预报插件,或者需要开发两个网站,一个供外部用户使用,一个供内部用户使用,而外部使用的网站需要调用内部网站等情况下,就需要使用跨域调用的技术。此类技术的一个代表就是Jsonp。

Jsonp(JSON with Padding)是资料格式 json 的一种“使用模式”,可以让网页从别的网域获取资料。Jsonp有很好的浏览器兼容性,包括IE6在内的大多浏览器都支持这种标准跨域数据访问方式。它的核心原理是利用script标签的跨域特性,间接实现数据调用。很容易理解了,利用script标签的话只能发送GET请求,无法发送POST请求。为便于理解,我先用原生Javascript的一个例子来说明。

例1:

A域名(a.com)下的index.html:function jsonpcallback(json){ //Jsonp回调函数,参数为返回的json数据

//对数据的后续操作。。。

console.log(json);

}

创建script标签 src="http://b.com/api.php?uid=5344&callback=jsonpcallback",发送请求

B域名(b.com)下的api.phpif(isset($_GET['uid']) && $_GET['uid']>0){

$uid = intval($_GET['uid']);

}

if(isset($_GET['callback'] && $_GET['callback']!=''){

$callback = $_GET['callback'];

}

//从数据库中调uid为5344的用户的数据...

$data = array('uid' => 5344,'name' => 'hxz','age' => 28,'sex' => '男');

$json = json_encode($data);

echo $callback."($json)";

运行 http://a.com/index.html 即可在开发者工具的console中看到成功调到的个人信息数据。

其具体流程如下:1.先定义一个标准JS函数,参数为一个json对象。

2.再写一个script标签请求api.php这个页面。把要调用的函数名和其他一些信息用url参数发送。

3.编写api.php,处理get请求并返回一个JS函数调用。这样A域名下的页面中的第二个script标签中的内容是jsonpcallback({uid:5344,...});,也就相当于调用了流程1中所述的标准JS函数。

4.已经成功取得了数据,只需在jsonpcallback函数中进行后续数据处理。

如果已经完全理解上述例子的话相信大家已经能够理解Jsonp的原理了,那么接下来介绍jsonp在使用上的优化。

可以发现a.com/index.html中定义了两个script标签,如此写法太过繁琐。故而一般JS框架都对jsonp有一定的封装以达到易于使用的目的。下面就以Jquery框架来优化index.html中的代码书写:

例2:$.ajax({

url: http://b.com/api.php,

data:{uid:5344},

dataType: 'jsonp',

jsonp:'callback',

//在一个 jsonp 请求中重写回调函数的名字。这个值用来替代在 "callback=?" 这种 GET 请求中 URL 参数里的 "callback" 部分,比如 {jsonp:'onJsonPLoad'} 会导致将 "onJsonPLoad=?" 传给服务器。

jsonpCallback: 'jsonpcallback',

//这主要用来让 jQuery 生成度独特的函数名,这个值用来替代在 "callback=?" 这种 GET 请求中 URL 参数里的 "?" 部分

success:function(json){

//对数据的后续操作。。。

console.log(json);

}

});

b.com/api.php中代码不变。这样JQuery就会自动动态加上例1中的script请求标签发送请求了。

显然Jquery对jsonp的封装并没有减少多少代码量。但写过一般ajax请求的同学可以发现,这个写法是为把ajax和jsonp的写法统一起来,使jsonp看上去就和一般的ajax请求没什么本质上区别。但其实jsonp和ajax是完全不同的实现原理,ajax是使用XHR(XmlHttpRequest)的新兴技术,而jsonp仅仅使用了script标签的特性,这是一个连很古老的浏览器都支持的技术。所以我不推荐使用jquery封装的代码来理解jsonp,它容易误导初学者。故而本文从一开始就使用了原生Js代码来讲解原理。请大家在理解原理的基础上再使用JS框架封装的代码来书写。如此才能完全掌握jsonp技术。

Jsonp的GET请求介绍完了,那它能发送POST请求吗?,这个问题将在下篇中进行介绍,敬请期待!

ajax的jsonp原理,jsonp 跨域原理和用法(上篇)相关推荐

  1. jsonp 跨域原理详解

    转载至:http://zha-zi.iteye.com/blog/1975116 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制 ...

  2. jsonp跨域原理_【网站技术解读①】Javascript实现跨域请求

    推荐一个读者做的不错的编程学习网站: 网站:潜安 域名:http://www.qianani.com 另外将会不定期推送近期网站用到的一些技术,讲一些核心原理,今天为第一篇 问题由来: 最近一直在优化 ...

  3. jquery Ajax 通过jsonp的方式跨域提交表单

    Jquery Ajax可以通过jsonp的方式跨域提交表单,至于什么是跨域提交简单说就是你的客户端和服务端不在同一个域名下或端口号不同也可以叫做跨域. 前台代码: $.ajax({type : 'ge ...

  4. ajax跨域原理以及解决方案

    ajax跨域原理以及解决方案 参考文章: (1)ajax跨域原理以及解决方案 (2)https://www.cnblogs.com/bojuetech/p/5895767.html (3)https: ...

  5. 【网络安全】浅析跨域原理及如何实现跨域

    前言 我们在解决一个问题的时候应该先去了解这个问题是如何产生的,为什么会有跨域的存在呢?其实,最终的罪魁祸首都是浏览器的同源策略,浏览器的同源策略限制我们只能在相同的协议.IP地址.端口号相同,如果有 ...

  6. js跨域解决方案php,详解js跨域原理以及2种解决方案_javascript技巧

    1.什么是跨域 我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题. 跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本 ...

  7. 前端CORS跨域原理详细分析

    前言 一般对于前端来说,解决跨域的方法有以下几种: 用img或script标签发起get请求 使用jsonp技术 配置跨域资源共享CORS 但是JSONP并不是一个好的跨域解决方案,它有着两个严重问题 ...

  8. php 跨域 json,jsonp+php实现跨域

    jsonp跨域原理 json和jsonp的区别 json是一种基于文本的数据交换方式,或者叫做描述数据的一种格式. var person = { "name": "tes ...

  9. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  10. php cors和jsonp,jsonp和CORS跨域实现

    搜索热词 写js时总是会遇到跨域请求的问题,现在了解了两种方法,记录之: 1)jsonp,使用jquery封装的$.ajax,返回数据类型要设置为jsonp,示例: $.ajax({ type: 'g ...

最新文章

  1. Qunee for HTML5 在电力方面的应用
  2. rsync 服务与配置文档
  3. BB之Uncaught exception:net.rim.device.api....错误的解决之道
  4. Kubernetes存储之Secret
  5. C#中的interface
  6. Imagination
  7. php 函数命名 特殊字符,php 特殊字符处理函数
  8. MySQL 高级 —— 深入理解 InnoDB 与 MyISAM
  9. AngularJs ui-router 路由的简单介绍
  10. json parse
  11. vue各种组件(不断增加中...)
  12. Bigasoft Audio Converter for Mac - 音频转换器
  13. MyBatis Generator逆向工程生成实体、接口、映射文件等代码
  14. 基于php的学校固定资产管理系统
  15. 利用python、selenium和超级鹰 实现B站自动登录
  16. 在线latex的一些操作
  17. 第六十一章 方法关键字 - Deprecated
  18. Stduino IDE stm32 最小系统 小蓝板 驱动继电器(五)
  19. 淘宝自动客服(旺旺机器人)
  20. GO语言开发天天生鲜项目第三天 用户模块开发

热门文章

  1. 12123总显示服务器繁忙,12123为什么登录时总是繁忙登不上的原因?
  2. win10 WSL2问题解决WslRegisterDistribution failed with error: 0x800701bc
  3. 这些职业进入“最缺工”排行!AI工程师年薪是研发人员2倍;小米投资黑芝麻智能估值达20亿美元 | 美通社头条...
  4. 转型成功——感恩首出集团鼎力相助!
  5. ubuntu 20.04 | .bashrc 文件详解
  6. Unsafe.compareAndSwapInt()方法解读
  7. WPS第二章的二级目录从1.1开始,怎么让它从2.1开始
  8. 我的世界服务器无限开号,我的世界1.7.X-1.12.X无限瞬间生存服务器
  9. 游戏建模行业前景广阔?需要什么条件才能踏足在行业?零基础须知
  10. 1.word2019