9.jsonp的实现原理

1. 由于浏览器的安全性限制,不允许AJAX访问 协议不同、域名不同、端口号不同的数据接口,浏览器认为这种访问不安全;
2. 以通过动态创建script标签的形式,把script标签的src属性,指向数据接口的地址,因为script标签不存在跨域限制,这种数据获取方式,称作JSONP(注意:根据JSONP的实现原理,知晓JSONP只支持Get请求);

3. 具体实现过程:

- 先在客户端定义一个回调方法,预定义对数据的操作;

- 再把这个回调方法的名称,通过URL传参的形式,提交到服务器的数据接口;

- 服务器数据接口组织好要发送给客户端的数据,再拿着客户端传递过来的回调方法名称,拼接出一个调用这个方法的字符串,发送给客户端去解析执行;

- 客户端拿到服务器返回的字符串之后,当作Script脚本去解析执行,这样就能够拿到JSONP的数据了;

4. 带大家通过 Node.js ,来手动实现一个JSONP的请求例子;

客户端:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <script>
    function showInfo123(data) {
      console.log(data)
    }
  </script>

<script src="http://127.0.0.1:3000/getscript?callback=showInfo123"></script>
<!-- <script>
  show()
</script> -->

</body>

</html>

服务端:app.js

// 导入 http 内置模块
const http = require(‘http‘)
// 这个核心模块,能够帮我们解析 URL地址,从而拿到  pathname  query
const urlModule = require(‘url‘)

// 创建一个 http 服务器
const server = http.createServer()
// 监听 http 服务器的 request 请求
server.on(‘request‘, function (req, res) {

  // const url = req.url
  const { pathname: url, query } = urlModule.parse(req.url, true)

  if (url === ‘/getscript‘) {
    // 拼接一个合法的JS脚本,这里拼接的是一个方法的调用
    // var scriptStr = ‘show()‘
    var data = {
      name: ‘xjj‘,
      age: 18,
      gender: ‘女孩子‘
    }

    var scriptStr = `${query.callback}(${JSON.stringify(data)})`
    // res.end 发送给 客户端, 客户端去把 这个 字符串,当作JS代码去解析执行
    res.end(scriptStr)
  } else {
    res.end(‘404‘)
  }
})

// 指定端口号并启动服务器监听
server.listen(3000, function () {
  console.log(‘server listen at http://127.0.0.1:3000‘)
})

nodemon  .\app.js

原文地址:https://www.cnblogs.com/yaboya/p/10246653.html

时间: 2024-10-16 06:59:25

9.jsonp的实现原理的相关文章

jsonp 跨域原理详解

JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进行多iframe或多窗口编程.以及Ajax编程时显得尤为重要.根据这个策略,在baidu.com下的页面中包含的JavaScript代码,不能访问在

jsonp的工作原理,观后必然懂!!!

jsonp的工作原理: 动态创建script标签,通过script标签中的src跨域属性,连接对方接口,并将回调函数通过接口传递给对方. 对方服务器在准备好数据后再通过调用回调函数并以传递参数的方式将数据返回来. 用代码给大家封装一个函数: function getDate(url,req){ var newData = ''; var oScr = document.createElement('script'); oScr.src = url + 'wd=' + req + '&cb=' +

Ajax和Jsonp的工作原理,以及区别。

Ajax工作原理是 相当于在用户和服务器之间加了-个中间层(AJAX引擎),使用户操作与服务器响应异步化. 对于用户请求ajax引擎会做一些数据验证和数据处理,不是所有请求都提交给服务器,当需要从服务器读取新数据时由Ajax引擎代为向服务器提交请求.AJAX最大优点就是不刷新整个页面的前提下与服务器通信维护数据. 过程的话 第一步:创建一个ajax引擎对象,ie6的是new ActiveXObject其他浏览器是new一个xmlHttpRequest对象 第二步 调用open方法启动一个请求以备

jsonp的工作原理

JSONP是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了,可以简单的理解为 带callback的json就是jsonp. 就是利用<script>标签没有跨域限制原理来达到与第三方通讯的目的.当需要通讯时,本站脚本创建一个<script>元素,地址指向第三方的API网址,形如: <script src=

深入剖析jsonp跨域原理

在项目中遇到一个jsonp跨域的问题,于是仔细的研究了一番jsonp跨域的原理.搞明白了一些以前不是很懂的地方,比如: 1)为什么jsonp跨域只能是get请求,而不能是post请求: 2)jsonp跨域的原理到底是什么魔法: 3)除了jsonp跨域之外还有那些方法绕过“同源策略”,实现跨域访问: 4)jsonp和ajax,或者说jsonp和XMLHttpRequest是什么关系: 等等. 1.同源策略 说到跨域,首先要明白“同源策略”.同源是指:js脚本只能访问或者请求相同协议,相同domai

Ajax和Jsonp的工作原理,以及区别

Ajax工作原理是: 相当于在用户和服务器之间加了-个中间层(AJAX引擎),使用户操作与服务器响应异步化. 对于用户请求ajax引擎会做一些数据验证和数据处理,不是所有请求都提交给服务器,当需要从服务器读取新数据时由Ajax引擎代为向服务器提交请求.AJAX最大优点就是不刷新整个页面的前提下与服务器通信维护数据. 过程的话 第一步:创建一个ajax引擎对象,ie6的是new ActiveXObject其他浏览器是new一个xmlHttpRequest对象 第二步 调用open方法启动一个请求以

JSONP 的工作原理是什么?

很简单,就是利用<script>标签没有跨域限制的"漏洞"(历史遗迹啊)来达到与第三方通讯的目的.当需要通讯时,本站脚本创建一个<script>元素,地址指向第三方的API网址,形如: <script src="http://www.example.net/api?param1=1&param2=2"></script> 并提供一个回调函数来接收数据(函数名可约定,或通过地址参数传递). 第三方产生的响应为js

jsonp跨域原理解析

前言: 跨域请求是前台开发中经常遇到的场景,但是由于浏览器同源策略,导致A域下普通的http请求没法加载B域下的数据,跨域问题由此产生.但是通过script标签的方式却可以加载非同域下的js,因此可以利用这一特性,进行跨域数据请求. 先看一下跨域导致的问题,测试域分别为 localhost 和 www.icity366.com, 下文分别对应A域和B域,测试文件为A域下的 data.jsp, 我们在A(localhost)域下请求B(www.icity366.com)域下的数据,看一下data.

原生javascript里jsonp的实现原理

ajax不能跨域,jsonp可以跨域 跨域的核心思想: 调用(拿到的接口),定义(jsonp核心处理器)分别是不同的script标签里面进行跨script取数据(只有get方式进行取数据 ) jsonp传进来的数据是{url:'',data:{ cbName='cb',(根据接口制定的命名规范,有些事叫callback) wd='aaa', ......(之后的数据都要进行字符串拼接) },success:function(result){}} 一:设置默认状态(容错处理) json=json|