深入分析JSONP跨域的原理

下面为你详细讲解“深入分析JSONP跨域的原理”的完整攻略。

一、JSONP跨域介绍

JSONP, 即 JSON with Padding,JSON 填充式,一般用于解决独立域名下ajax无法访问的问题,是一种跨域的解决方案。JSONP 实现的基本思路是利用 script 标签可以跨域请求资源的特性,来达到与第三方通信的目的。

在前端页面中,我们可以通过script标签请求一个跨域的资源,服务器将数据以JavaScript对象的形式返回,然后前端使用回调函数对返回的数据进行处理。这种方案用在跨域嵌入广告、第三方登录(如QQ、微信等)、使用第三方的API等常见场景中。

二、JSONP跨域的原理

当使用 script 标签来引用一个跨域资源时,浏览器就会像普通情况一样发送请求,但是服务器端需要做出特殊的响应。

JSONP的原理非常简单,就是将请求信息放在函数调用参数中。具体实现过程如下:

  • 声明一个函数,函数名作为查询参数发送到服务器端
  • 服务器端解析请求参数,并且将需要返回的数据拼接在函数调用中
  • 服务器端将拼接好的内容返回给前端
  • 前端成功接收到数据后,执行该函数进行解析

三、JSONP跨域的示例

1. 前后端分离项目

前端代码(请求movie.json):

function handleData(data) {
  console.log(data);
}

var script = document.createElement('script');
script.type = "text/javascript";
script.src = "http://localhost:3000/movie.json?callback=handleData";
document.body.appendChild(script);

后端代码:

// 通过url获取jsonp参数值,假设传入的jsonp函数名为handleData
var jsonpCallback = req.query.callback;
var data = {
  title: '肖申克的救赎',
  duration: 120
};
// 返回数据,注意客户端传来的callback函数用括号包裹
res.send(jsonpCallback + '(' + JSON.stringify(data) + ')');

2. 前后端不分离项目

前端代码:

function handleData(data) {
  console.log(data);
}

var script = document.createElement('script');
script.type = "text/javascript";
script.src = "http://localhost:3000/movie?callback=handleData";
document.body.appendChild(script);

后端代码:

// 通过url获取jsonp参数值,假设传入的jsonp函数名为handleData
var jsonpCallback = req.query.callback;
var data = {
  title: '肖申克的救赎',
  duration: 120
};
// 返回数据,注意客户端传来的callback函数用括号包裹
res.render('movie', {
  data: JSON.stringify(data),
  callback: jsonpCallback
});

模板渲染movie.ejs:

<!-- 注意此处需要将回调函数名和返回数据以script标签的形式返回给前端 -->
<script>
  <%= callback %>(<%= data %>)
</script>

四、JSONP跨域的优缺点

优点:

  • 兼容性好,可以使用在各种不同的浏览器上
  • 具有灵活性,因为可以指定回调函数名,方便前端使用

缺点:

  • 安全性问题,因为JSONP中的请求方式只支持get方法,所以其数据暴露在URL中,容易被拦截截取或篡改
  • 对服务器不太友好。因为每次请求都会调用回调函数,需要消耗一部分性能。此外,如果接口需要权限认证,JSONP 则会变得繁琐。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入分析JSONP跨域的原理 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • jQWidgets jqxScheduler appointmentClick事件

    下面是关于“jQWidgets jqxScheduler appointmentClick事件”的详细讲解,包含完整的攻略和两个示例说明。 一、jqxScheduler框架简介 jqxScheduler是jQWidgets中的一种日历调度控件,可以用于展示和管理时间安排、计划、约会等信息。它提供了大量的可配置选项,允许开发人员对其进行高度自定义,以适应各种日…

    jquery 2023年5月11日
    00
  • jQuery使用$.ajax进行即时验证的方法

    下面是关于“jQuery使用$.ajax进行即时验证的方法”的完整攻略。 1. 什么是$.ajax $.ajax() 方法是 jQuery 提供的一个用于异步执行 HTTP 请求的工具。它可以用来向服务器发送请求并获取服务器返回的数据,以实现页面内容的异步更新和数据交互。 2. $.ajax方法的基本语法 $.ajax() 方法的基本语法如下: $.ajax…

    jquery 2023年5月27日
    00
  • jQWidgets jqxInput打开的属性

    jQWidgets jqxInput 打开事件攻略 简介 jQWidgets 是一个基于 jQuery 的 UI 组件库,提供丰富的 UI和工具用于创建现代化应用程序。jqxInput 组件用于创建一个文本输入框。本攻略详细介绍 jqInput 组件的打开事件,包括如何使用和示例说明。 使用 jqxInput 组件的 open 事件在下拉列表框打开时触发。以…

    jquery 2023年5月10日
    00
  • 关于jQuery的inArray 方法介绍

    下面是关于jQuery的inArray方法的详细介绍: 什么是inArray方法 inArray方法是jQuery中的一个数组工具方法,它用于查找给定值在数组中的位置。 语法 该方法的语法格式如下: $.inArray(value, array, [fromIndex]) 其中,value表示需要查找的值,array表示需要查找的数组,fromIndex表示…

    jquery 2023年5月28日
    00
  • javascript 动态脚本添加的简单方法

    当网页文档加载的时候,我们可以通过动态添加JavaScript脚本来给网页添加更多的交互性和动态性。下面将介绍JavaScript动态脚本添加的简单方法。 基本用法 动态添加JavaScript脚本的方法非常简单,只需要使用document.createElement方法创建一个script元素,然后设置其src属性即可。 var script = docu…

    jquery 2023年5月27日
    00
  • jQWidgets jqxGrid commandcolumn属性

    以下是关于“jQWidgets jqxGrid commandcolumn属性”的完整攻略,包含两个示例说明: 简介 jqxGrid 控件的 commandcolumn 属性于在表格中添加自定义命令按钮列。 完整攻略 以下是 jqxGrid 控件 commandcolumn 属性的完整攻略: 定义 commandcolumn 在 jqxGrid 控件中,可以…

    jquery 2023年5月11日
    00
  • Jquery使用AJAX方法请求数据

    以下是“Jquery使用AJAX方法请求数据”的完整攻略。 一、AJAX是什么? AJAX(Asynchronous JavaScript and XML)即异步 JavaScript 和 XML,它是一种创建快速、动态网页的技术。AJAX技术可以在不刷新整个页面的情况下,实现局部的异步刷新,从而提高用户的体验。 二、Jquery通过AJAX方法请求数据 J…

    jquery 2023年5月27日
    00
  • jQWidgets jqxTabs hideCloseButtonAt()方法

    jQWidgets jqxTabs 是一个用于创建标签页选项卡的 Jquery 插件。其中 jqxTabs.hideCloseButtonAt() 方法用于隐藏指定位置的标签页关闭按钮。 hideCloseButtonAt() 方法使用方法 hideCloseButtonAt() 方法可用于隐藏特定位置的标签页关闭按钮。可以通过调用该方法并传递要隐藏关闭按钮…

    jquery 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部