跨域与JSONP

news2024/9/24 23:24:16

1、同源策略

1.1、什么是同源

如果两个页面的协议域名端口都相同,则两个页面具有相同的源

例如,下表给出了相对于 http://www.test.com/index.html 页面的同源检测:

URL

是否同源

原因

http://www.test.com/other.html

同源(协议、域名、端口相同)

https://www.test.com/about.html

协议不同(http https

http://blog.test.com/movie.html

域名不同(www.test.com blog.test.com

http://www.test.com:7001/home.html

端口不同(默认的 80 端口与 7001 端口)

http://www.test.com:80/main.html

同源(协议、域名、端口相同)

1.2、什么是同源策略

同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能

MDN 官方给定的概念:同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

通俗的理解:浏览器规定,A 网站的 JavaScript,不允许和非同源的网站 C 之间,进行资源的交互,例如:

  1. 无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB
  2. 无法接触非同源网页的 DOM
  3. 无法向非同源地址发送 Ajax 请求

2、跨域

2.1、什么是跨域

同源指的是两个 URL 的协议、域名、端口一致,反之,则是跨域

出现跨域的根本原因:浏览器的同源策略不允许非同源的 URL 之间进行资源的交互。

网页:http://www.test.com/index.html

接口:http://www.api.com/userlist

2.2、浏览器对跨域请求的拦截

注意:浏览器允许发起跨域请求,但是,跨域请求回来的数据,会被浏览器拦截,无法被页面获取到! 

2.3、如何实现跨域数据请求

现如今,实现跨域数据请求,最主要的两种解决方案,分别是 JSONP CORS

JSONP:出现的早,兼容性好(兼容低版本IE)。是前端程序员为了解决跨域问题,被迫想出来的一种临时解决方案。缺点是只支持 GET 请求,不支持 POST 请求。

CORS:出现的较晚,它是 W3C 标准,属于跨域 Ajax 请求的根本解决方案。支持 GET POST 请求。缺点是不兼容某些低版本的浏览器。

3、JSONP

3.1、什么是JSONP

        JSONP (JSON with Padding) 是 JSON 的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。

3.2、JSONP的实现原理

        由于浏览器同源策略的限制,网页中无法通过 Ajax 请求非同源的接口数据。但是 <script> 标签不受浏览器同源策略的影响,可以通过 src 属性,请求非同源的 js 脚本。

        因此,JSONP 的实现原理,就是通过 <script> 标签的 src 属性,请求跨域的数据接口,并通过函数调用的形式,接收跨域接口响应回来的数据。

getData.js

abc({ name: 'ls', age: 30 })
<!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 abc(data) {
      console.log('拿到了Data数据:')
      console.log(data)
    }
  </script>

  <script src="./js/getdata.js?callback=abc"></script>
</body>

</html>

3.3、自己实现一个简单的JSONP

定义一个 success 回调函数:

 <script>
   function success(data) {
     console.log('获取到了data数据:')
     console.log(data)
   }
 </script>

通过 <script> 标签,请求接口数据:

<script src="http://ajax.frontend.itheima.net:3006/api/jsonp?callback=success&name=zs&age=20"></script>

Java服务端处理方式:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 response.setCharacterEncoding("UTF-8");
 response.setContentType("text/html;charset=UTF-8");

 //数据
 List<Student> studentList = getStudentList();


 JSONArray jsonArray = JSONArray.fromObject(studentList);
 String result = jsonArray.toString();

 //前端传过来的回调函数名称
 String callback = request.getParameter("callback");
 //用回调函数名称包裹返回数据,这样,返回数据就作为回调函数的参数传回去了
 result = callback + "(" + result + ")";

 response.getWriter().write(result);
}

3.4、JSONP的缺点

        由于 JSONP 是通过 <script> 标签的 src 属性,来实现跨域数据获取的,所以,JSONP 只支持 GET 数据请求,不支持 POST 请求。

        注意:JSONP Ajax 之间没有任何关系,不能把 JSONP 请求数据的方式叫做 Ajax,因为JSONP 没有用到 XMLHttpRequest 这个对象。

3.5、jQuery中的JSONP

        jQuery 提供的 $.ajax() 函数,除了可以发起真正的 Ajax 数据请求之外,还能够发起 JSONP 数据请求,例如:

 $.ajax({
    url: 'http://ajax.frontend.itheima.net:3006/api/jsonp?name=zs&age=20',
    // 如果要使用 $.ajax() 发起 JSONP 请求,必须指定 datatype 为 jsonp
    dataType: 'jsonp',
    success: function(res) {
       console.log(res)
    }
 })

        默认情况下,使用 jQuery 发起 JSONP 请求,会自动携带一个 callback=jQueryxxx 的参数,jQueryxxx 是随机生成的一个回调函数名称。

3.6、自定义参数及回调函数名称

        在使用 jQuery 发起 JSONP 请求时,如果想要自定义 JSONP 参数以及回调函数名称,可以通过如下两个参数来指定:

 $.ajax({
    url: 'http://ajax.frontend.itheima.net:3006/api/jsonp?name=zs&age=20',
    dataType: 'jsonp',
    // 发送到服务端的参数名称,默认值为 callback
    jsonp: 'callback',
    // 自定义的回调函数名称,默认值为 jQueryxxx 格式
    jsonpCallback: 'abc',
    success: function(res) {
       console.log(res)
    }
 })

3.7、jQueryJSONP的实现过程

        jQuery 中的 JSONP,也是通过 <script> 标签的 src 属性实现跨域数据访问的,只不过,jQuery 采用的是动态创建和移除 <script> 标签的方式,来发起 JSONP 数据请求。

  • 发起 JSONP 请求的时候,动态向 <header> 中 append 一个 <script> 标签;
  • JSONP 请求成功以后,动态从 <header> 中移除刚才 append 进去的 <script> 标签;

相关资料:地址链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/140570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧图书馆中的“智慧”体现在哪些方面?

在信息时代背景下&#xff0c;各个领域都发生了巨大变革&#xff0c;图书馆也不例外&#xff0c;开始逐步向着现代化方向发展。传统图书馆存在较多的缺陷&#xff0c;已经无法满足人们的借阅需求&#xff0c;引进信息化技术&#xff0c;打造智慧图书馆是目前图书馆的必然发展趋…

Linux学习记录——오 vim基本知识

** Linux开发工具 ** Linux开发工具——vim vim最小集 vim是一个多模式编辑器&#xff0c;vi也一样&#xff0c;但vim兼容了vi的所有指令&#xff0c;还有一些独有的特性&#xff0c;本篇只针对vim展开。vim有各种模式&#xff0c;每个模式的用法都有差别&#xff0c;模式…

【数据在内存中的存储】肝货满满

前言 我们知道在C语言中的基本内置类型&#xff1a; char //字符数据类型short //短整型int //整形long //长整形long long //更长的整形float //单精度浮点型double //双精度浮点型 那么这些类型是如何存储的呢&#xff1f; 回顾指针类型&#xff1a; *int pi*char pc*float…

String的讲解(Java系列9)

目录 前言&#xff1a; 1.String 1.1字符串的构造 1.2Sting对象的比较 1.3字符串的查找 1.4字符串的转化 1.4.1数值和字符转换 1.4.2大小写转换 1.4.3字符串转数组 1.4.4格式化 1.5字符串的替换 1.6字符串拆分 1.7字符串截取 1.8字符串去空格 1.9字符串的不可变…

Matplotlib笔记 · 绘图区域的结构和子图布局与划分(figure, axes, subplots)

文章目录1. 绘图区域的结构2. subplot系方法 ( subplot布局 )2.1 使用 add_subplot(nrows, ncols, index) 逐一创建子图2.2 控制子图大小和位置 ( add_subplot(nrows, ncols, index) 参数详解 )2.3 使用 subplots(nrows, ncols) 批量创建多张子图3. axes系方法 ( axes布局 )3.1…

基于张量变换域低秩正则化的图像恢复方法

高光谱图像、磁共振图像、RGB图像等都可以表示成三维数组的形式&#xff0c;在数学上将这种多维数组称为高阶张量&#xff0c;同样&#xff0c;上述三种图像都可以表示成三阶张量。在空间上&#xff0c;图像本身就具有结构相似性&#xff0c;在高光谱图像的第三个模态上&#x…

日志分析工具

iis、windows日志做日志分析比较麻烦&#xff0c;这里找到了一款好用的免费的日志分析工具 Log Parser Lizard&#xff0c;下载这个工具之前建议先安装LogParser虽然他会自动弹窗提示。 1. 安装软件 安装没什么好说的一直下一步下一步就行 启动之后点击OK 弹出激活页面让激活…

mod函数怎么取模

mod 是 MySQL 中的数值函数&#xff0c;写法为&#xff1a;mod(x,y)&#xff0c;意思是返回x/y的取模的值。 什么是取模&#xff1f;取模就是取余数。 ① 如果第一个值比第二个值大&#xff0c;我整理出来的取模公式就是&#xff1a;第一个值-第一个值里面包含了几个第二个值相…

MATLAB-多边形填充图绘制

fill函数用于绘制并填充二维多边图形。将数据点视为多边形顶点&#xff0c;并将此多边形涂上颜色&#xff0c;便于用户理解图形中的数据代表的含义。具体调用方法如下:fill(X, Y,C):用X和Y中的数据生成多边形&#xff0c;用C指定颜色填充。其中C为色图向量或矩阵。若C是行向量&…

商标注册流程有什么步骤

​一、商标注册流程有什么步骤? 商标注册流程&#xff1a; 1、需要企业提供营业执照副本复印件和商标样稿及主要商品或服务&#xff0c;递交商标局; ​ 2、商标局形式审查(7-15个工作日)接到《商标注册申请受理通知书》; 3、商标局实质审查(5-8个月左右); 4、商标公告(3…

【Linux多线程编程】3. 多线程共享资源

回顾 上篇文章【Linux多线程编程】2.线程创建与回收 简单介绍了如何创建一个线程并且回收它&#xff0c;末尾给出了如下这段代码&#xff0c;本文将从这段代码入手介绍线程资源、线程共享资源、线程独占资源&#xff0c;并在最后引出多线程安全访问资源的方法。 /** test_pth…

新华三(H3C)的沉浮往事

根据2023年1月3日紫光股份发布的最新公告&#xff0c;Hewlett Packard Enterprise Company全资子公司H3C Holdings Limited&#xff08;“HPE 开曼”&#xff09;和Izar Holding Co&#xff0c;将向紫光股份全资子公司紫光国际信息技术有限公司出售其持有的新华三集团有限公司合…

【Linux】伪目标 PHONY | 探讨项目构建问题 | Makefile | 依赖关系与依赖方法

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》&#x1f448; 猛戳订阅 &#x1f525; &#x1f4ad; 写在前面&#xff1a;本章我们要学习的是 makefile。会不会写 makefile&#xff0c;从一个侧面说明一个人是否具备完成大型工程的能力。一个工程中的源文件不计…

Vector - VT System - 板卡_VT1004

今天我们来聊一下导入和测量模块VT1004版本&#xff0c;我们从它的技术参数、通道介绍、功能介绍几个方面来全面的介绍这块板卡&#xff0c;废话不多说&#xff0c;我们直接来看这2块板卡吧。 测量模块 - VT1004 通道功能介绍&#xff1a; >通过继电器切换到原始负载和母线…

Qt扫盲-QSet理论总结

QSet理论总结一、概述二、使用1. 声明2. 插入元素3. 遍历元素4. 删除元素5. 集合的运算6. 其他一、概述 QSet是Qt的通用容器类之一。俗称一个集合。QSet会按未指定的顺序存储值&#xff0c;也就是随机存值的方式&#xff0c;并提供非常快速的值查找。在内部&#xff0c;QSet实…

python学习|第二天

文章目录1.函数函数调用函数返回值函数参数2.bug常见类型粗心类型知识点不扎实思路不清被动掉坑常见异常类型3.文件的读写打开模式文件对象常用方法with方法4.os模块操作目录相关函数5.打包成可执行文件1.函数 函数调用 p89&#xff0c;笔记待补 函数返回值 1&#xff09;如…

微信小程序开发过程整理

目录1微信开发相关介绍1.1微信公众平台1.2微信开放平台1.3注意事项2微信小程序开发整体介绍2.1微信小程序简介2.2小程序接入流程3框架简介3.1uni-app简介3.2学习使用uni-app3.3学习微信小程序开发4开发规范5开发示例5.1开发工具5.2开发调试5.2.1导入代码5.2.2项目运行5.2.3在微…

java常见题3

11.二分查找的次数 奇数取 中间那一个作为中值 偶数个取 中间靠左 然后不断模拟这个算法 查找的最多次数&#xff1a;n个元素里最多查找log二N 个元素Log2 128 7 12.equals和hashCode java.lang.Object类中有两个非常重要的方法&#xff1a; public boolean equals(Obje…

YOLOV5模型训练

之前在博文中讲到了YOLOV5的运行,以及转tensorrt. 但是, 一个模型通常需要结合数据训练,才能得到更好的结果. 因此,我们有必要熟悉yolov5的训练过程. 执行训练的过程 Yolov5的github提供了官方的训练脚本. 第一次运行,会自动下载数据集,然后会检测到你的gpu配置,如果不对,…

【数据结构】树

树(Tree) 知识框架 树的定义 树和图一样都是非线性结构&#xff0c;树是n个结点的有限集合&#xff0c;当n0时&#xff0c;称这棵树为空树。 非空树有以下特征&#xff1a; 有且仅有一个称为根的结点。如果n>1, 除根结点以外其它结点可以分为m(m>0)个不相交的集合T1,T…