【Vue.js 入门与实战】--结合Node手写JSONP服务器剖析JSONP原理

简介: 由于浏览器的安全性限制,不允许AJAX访问协议不同、域名不同、端口号不同的 数据接口,浏览器认为这种访问不安全。因为后端服务器的接口比如运行在33 或44上,但是前端网站运行在80端口。前后端端口不一样,要实现跨域访问,前后端合作开发更多的使用JSONP。

结合Node手写JSONP服务器剖析JSONP原理

 

 

目录

一、JSONP的实现原理

二、  代码演示

 

 

一、JSONP的实现原理

  • 由于浏览器的安全性限制,不允许AJAX访问协议不同、域名不同、端口号不同的 数据接口,浏览器认为这种访问不安全。因为后端服务器的接口比如运行在33 44上,但是前端网站运行在80端口。前后端端口不一样,要实现跨域访问,前后端合作开发更多的使用JSONP

 

  • 可以通过动态创建 script标签的形式,把 script 标签的 src 属性,指向数据接口的地址,因为script 标签不存在跨城限制,这种数据获取方式,称作 JSONP (注意:根据JSONP的实现原理,JSONP只支持Get请求)

具体实现过程:

  • 先在客户端定义一个回调方法,预定义对数据的操作。
  • 再把这个回调方法的名称,通过 URL 传参的形式,提交到服务器的数据口。
  • 服务器数据接口组织好要发送给客户端的数据,再拿着客户端传递过来的回调方法名称拼接出一个调用这个方法的字行中,发送给客户端去解析执行。
  • 客户端拿到服务器返回的字行串之后,当作 Script 脚本去解折执行,这样就能能拿到 JSONP 的数据了

 

 

二、代码演示

模拟手动实现JSONP 服务器端代码使用 node 编写,客户端也可以请求node 服务端的 JSONP 地址。

首先新建客户端 JSONP 页面:06客户端JSONP 页面.html

<script>

function show() {

console.log(ok)//表示调用 show 方法输出 ok,页面一旦被展示出来,浏览器的内存中就会有 show 方法。

}

<script>

<script scr=”http://127.0.0.1:3000/getscript”></script>//请求服务器标签,端口是3000,存在跨域限制。如果不写端口默认为80Script 标签不受端口限制可以请求。

新建文件 node-server ,新建服务器端app.js

服务器端:

快速创建一个 node 服务器。

//导入 http 内置模块

const http= zequize('http')

//创建一个 http 服务器

const server =http.createserver()

//监听 http 服务器的request 请求

server.on('request',function (req,res) {

const url = req.url

const ( pathname:url,query)=urlModule.parse(req.uzl,true)

 

if(url=’/getscript') {

//客户端script 的目的是请求脚本,在这里监听到它的请求,返回一个合法的 js 文件,方法的调用就属于合法的 js ,这里可以调用show 方法,拼接一个合法的 Js 脚本.这里拼接的是一个方法的调用。

这个方法服务器端没有,这只是一个字符串,通过 res.end 发送给客户端,客户端把这个字符串当作 JS 代码解析执行。

相当于客户端的 src 请求回来之后变成了一个 sript 里面包含 show 方法的调用。如果要调用 show 方法也可以进行调用,因为已经定义了 show 方法。

Var scriptstr ='show()’

Res.end{scriptstr}

}else{

Res.end{‘404’ }

}

})

启动服务器

image.png

 

刷新页面,输出 okok 输出是因为请求了脚本,脚本反馈的结果是方法的调用。脚本请求过来以后,浏览器解析执行该脚本。

 

 

对代码升级优化:

function show(),show 方法写成了固定的,服务器无法判断 show

所以需要客户端把方法的名称通过var script 传递,获取到值以后,把方法的名称动态拼接到 show 。这样可以保证方法的适用性。

<script>

function showInfo(data) {

console.log(data)//表示调用 show方法输出 ok

}

<script>

<script scr=”http://127.0.0.1:3000/getscript?callback=showinfo”></script>//show改名后服务器再进行访问就无法执行了。可以通过

Callback showinfo 名称传递过去。

 

服务器端:

Const urlmodule=require(‘url’)

//这个核心模块帮助解析 URL 地址,从而拿到 pathname query pathname 就是url

Const{pathname:url,query}= urlmodule.parse(req.url,true)

//query要解析成一个对象,true 代表模块内部的方法会调用querystring 模块解析对象。

 

内部解析出一个pathname 对象,重命名为 url 还能解析出 query

if(url===’/getscript) {

Var scriptstr ='${qiery.callback} ()’//表示如果请求地址等于 getscript ,则返回方法的调用,但是方法名不能写死。而是通过 query .callback

Res.end{scriptstr}

}else{

Res.end{‘404’ }

}

})

结果输出:ok

服务器端返回的脚本会执行本地的已经定义好的方法,现在服务器端只是调用了方法,但是在调用方法时也可以为方法传一个数据对象。即服务器端拼接好的数据。

 

范例如下:

Var: data={

Name:’xjj’,

age:18,

gender:'女孩子

}

var scriptstr =$(query.callback){$(JSON.stringify(data)})

res.end(scriptstr)

//在调用方法时,可以把数据对象传递进去,但是这里只接收字符串,data 是一个对象。不能直接在 var scriptstr =$(query.callback) 后拼接,如果拼接会调用它的obj.tostring  tostring得到的不是真正的字符串。

应该把 data 对象转成字符串拼接在后面,在调用方法时,给它传一个 JSON.字符串的一个数据类型。这样客户端就可以获取到传递的数据。

 

因为

$(query.callback){$(JSON.stringify(data) }是一个方法调用,和show()方法调用相同。

} else {

res.end('404')

 

 

总结JSONP 的实现原理:

客户端定义一个方法的调用,服务器返回一个具体方法的调用,如果需要获取某些数据,服务器先把数据组织好,在调用方法时传入。

相关文章
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
461 19
|
JavaScript 前端开发 算法
vue渲染页面的原理
vue渲染页面的原理
438 56
|
JSON JavaScript 前端开发
菜鸟之路Day23一一JavaScript 入门
本文介绍了 JavaScript 的基础内容,包括 JS 的引入方式、基础语法、数据类型、运算符、类型转换、函数、对象(如 Array、String、自定义对象、JSON、BOM 和 DOM)、事件监听,以及 Vue 框架的初步使用。重点讲解了内部和外部脚本的引入、变量声明(var、let、const)、常见输出语句、数组与字符串的操作方法、DOM 操作及事件绑定,并通过实例展示了 Vue 的双向数据绑定和常用指令(v-bind、v-model、v-on、v-if、v-for 等)。
511 7
|
JavaScript 前端开发 UED
vue2和vue3的响应式原理有何不同?
大家好,我是V哥。本文详细对比了Vue 2与Vue 3的响应式原理:Vue 2基于`Object.defineProperty()`,适合小型项目但存在性能瓶颈;Vue 3采用`Proxy`,大幅优化初始化、更新性能及内存占用,更高效稳定。此外,我建议前端开发者关注鸿蒙趋势,2025年将是国产化替代关键期,推荐《鸿蒙 HarmonyOS 开发之路》卷1助你入行。老项目用Vue 2?不妨升级到Vue 3,提升用户体验!关注V哥爱编程,全栈开发轻松上手。
1050 2
|
JavaScript 前端开发 Java
深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
Array.find() 是 JavaScript 数组方法中一个非常实用和强大的工具。它不仅提供了简洁的查找操作,还具有性能上的独特优势:返回的引用能够直接影响原数组的数据内容,使得数据更新更加高效。通过各种场景的展示,我们可以看到 Array.find() 在更新、条件查找和嵌套结构查找等场景中的广泛应用。 在实际开发中,掌握 Array.find() 的特性和使用技巧,可以让代码更加简洁高效,特别是在需要直接修改原数据内容的情形。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
监控 JavaScript 前端开发
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
MutationObserver 是一个非常强大的 API,提供了一种高效、灵活的方式来监听和响应 DOM 变化。它解决了传统 DOM 事件监听器的诸多局限性,通过异步、批量的方式处理 DOM 变化,大大提高了性能和效率。在实际开发中,合理使用 MutationObserver 可以帮助我们更好地控制 DOM 操作,提高代码的健壮性和可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
JavaScript 前端开发
【JavaScript】——JS基础入门常见操作(大量举例)
JS引入方式,JS基础语法,JS增删查改,JS函数,JS对象
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
599 17