当前位置: 首页 > news >正文

【基础类】—前后端通信类系统性学习

一、什么是同源策略及限制

  1. 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。
  2. 源:协议、域名和端口, 默认端口是80
    三者有一个不同,即源不同,就是跨域
https://www.baidu.com:80/
https://www.baidu.com:8080
// 不同源
  1. 限制:不是一个源的文档,你没有权利去操作另一个源的文档,主要限制方面
    3-1. Cookie、LocalStorage 和 IndexDB 无法读取
    3-2. DOM无法获得
    3-3. Ajax 请求不能发送

二、前后端如何通信

  1. Ajax
    同源下通信方式
  2. WebSocket
    支持同源和跨域通信
  3. CORS
    支持同源和跨域通信

三、如何创建Ajax

  1. XMLHttpRequest 对象的工作流程
    1-1 声明对象,兼容IE
    1-2 根据请求方式的不同,设置不同传参方式
    1-3 open方法,确定发送的方式、地址、是否异步
    1-4 send方法,发送请求
    1-5 监听响应状态变化, 处理返回数据
 /*** [json 实现ajax的json]* @param  {[type]} options [description]* @return {[type]}         [description]*/util.json = function (options) {var opt = {url: '',type: 'get',data: {},success: function () {},error: function () {},};util.extend(opt, options);if (opt.url) {// ①声明对象,兼容IEvar xhr = XMLHttpRequest? new XMLHttpRequest(): new ActiveXObject('Microsoft.XMLHTTP');var data = opt.data,url = opt.url,type = opt.type.toUpperCase(),dataArr = [];for (var k in data) {dataArr.push(k + '=' + data[k]);}// ② 根据请求方式的不同,传递参数的方式也不相同if (type === 'GET') {url = url + '?' + dataArr.join('&');// ③ open方法,确定发送的方式、地址、是否异步xhr.open(type, url.replace(/\?$/g, ''), true);// ④ send方法,发送请求xhr.send();}if (type === 'POST') {xhr.open(type, url, true);xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');xhr.send(dataArr.join('&'));}// ⑤ 监听响应状态变化xhr.onload = function () {// ⑥ 处理返回数据, 200表示成功返回 304表示缓存中读取, 如果请求是媒体资源,还需要判断206,因为媒体资源是分段返回的if (xhr.status === 200 || xhr.status === 304) {var res;if (opt.success && opt.success instanceof Function) {res = xhr.responseText;if (typeof res === 'string') {res = JSON.parse(res);opt.success.call(xhr, res);}}} else {if (opt.error && opt.error instanceof Function) {opt.error.call(xhr, res);}}};}};
  1. 兼容性处理
  2. 事件的触发条件
  3. 事件的触发顺序

四、跨域通信的几种方式

1.JSONP

  1. JSONP: 再出来postMessage之前,一直使用JSONP进行跨域通信
  2. JSONP 原理: 利用script标签的异步加载来实现的
  3. JSONP 具体的实现逻辑
    3-1 向服务端发送请求,并告诉服务端callback的名称
<script src="http:www.abc.com/?callback=jsonp"></script>

3-2 服务端返回数据,全局注册jsonp函数,同时执行本地jsonp函数

<script src="http:www.abc.com/?callback=jsonp"></script>
<script>jsonp({data: {}})
</script>
  1. 代码实现步骤
    4-1 确定回调函数的名称
    4-2 根据名称注册全局函数
    4-3 动态创建scrpit标签
    4-4 监听脚本的加载事件
    4-5 监听加载是否成功,成功后,删除该script标签,同时删除全局函数
    4-6 往html里面新增script标签,发送请求

  2. 具体代码实现

  /*** [function jsonp]* @param  {[type]} url      [description]* @param  {[type]} onsucess [description]* @param  {[type]} onerror  [description]* @param  {[type]} charset  [description]* @return {[type]}          [description]*/util.jsonp = function (url, onsuccess, onerror, charset) {var callbackName = util.getName('tt_player');window[callbackName] = function () {if (onsuccess && util.isFunction(onsuccess)) {onsuccess(arguments[0]);}};var script = util.createScript(url + '&callback=' + callbackName, charset);script.onload = script.onreadystatechange = function () {if (!script.readyState || /loaded|complete/.test(script.readyState)) {script.onload = script.onreadystatechange = null;// 移除该script的 DOM 对象if (script.parentNode) {script.parentNode.removeChild(script);}// 删除函数或变量window[callbackName] = null;}};script.onerror = function () {if (onerror && util.isFunction(onerror)) {onerror();}};document.getElementsByTagName('head')[0].appendChild(script);};

2.Hash

  1. Hash: url中,#号后面的东西为hash, hash的变动,页面不会刷新
  2. search: url中,?号后面的东西叫search,search的改变,页面会刷新,所以search不能做跨域通信
  3. 使用hash通信 代码实现
// 利用hash,场景是当前页面 A 通过iframe或frame嵌入了跨域的页面 B// 在A中伪代码如下:var B = document.getElementsByTagName('iframe');B.src = B.src + '#' + 'data';// 在B中的伪代码如下window.onhashchange = function () {var data = window.location.hash;};

3.postMessage

  1. postMessage:同源策略是限制跨域通信,实际业务中又需要跨域通信,使用postMessage实现跨域通信,H5新出的
  2. postMessage代码实现
// postMessage// 窗口A(http:A.com)向跨域的窗口B(http:B.com)发送信息Awindow.postMessage('data', 'http://B.com');// 在窗口B中监听Bwindow.addEventListener('message', function (event) {console.log(event.origin); // 确定发送的源, http://A.comconsole.log(event.source); // A window的引用console.log(event.data); // data}, false);

4.WebSocket

  1. WebSocket:支持跨域通信
  2. WebSocket 代码实现
// Websocket【参考资料】http://www.ruanyifeng.com/blog/2017/05/websocket.html// wss 服务器地址var ws = new WebSocket('wss://echo.websocket.org');// 发送请求ws.onopen = function (evt) {console.log('Connection open ...');ws.send('Hello WebSockets!');};// 接收消息ws.onmessage = function (evt) {console.log('Received Message: ', evt.data);ws.close();};// 关闭连接ws.onclose = function (evt) {console.log('Connection closed.');};

5.CORS

  1. CORS:支持跨域通信的Ajax
// CORS【参考资料】http://www.ruanyifeng.com/blog/2016/04/cors.html// url(必选),options(可选)fetch('/some/url/', {method: 'get',}).then(function (response) {}).catch(function (err) {// 出错了,等价于 then 的第二个参数,但这样更好用更直观});

相关文章:

【基础类】—前后端通信类系统性学习

一、什么是同源策略及限制 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。源&#xff1a;协议、域名和端口&#xff0c; 默认端口是80 三者有一个不同&#xff0c;即源不同&#xff0c;就是跨域 ht…...

vite项目中使用@代表根路径

1.配置vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from pathexport default defineConfig({plugins: [vue()],resolve: {alias:{: path.resolve(__dirname, src) }} })2.报错path和__dirname 找不到模块“path”或其相…...

冶金化工操作VR虚拟仿真实验软件提高员工们协同作业的配合度

对于高风险行业来说&#xff0c;开展安全教育培训是企业的重点工作&#xff0c;传统培训逐渐跟不上时代变化和工人需求&#xff0c;冶金安全VR模拟仿真培训系统作为一种新型的教育和培训工具&#xff0c;借助VR虚拟现实技术为冶金行业的工人提供一个安全、高效的培训环境。 冶金…...

SQL Server数据库 -- 索引与视图

文章目录 一、索引 聚集索引非聚集索引二、视图三、自定义函数 标量函数表值函数四、游标五、总结 前言 在学习完创建库表、查询等知识点后&#xff0c;为了更加方便优化数据库的存储和内容&#xff0c;我们需要学习一系列的方法例如索引与视图等等&#xff0c;从而使我们更加…...

2023 java web面试秘籍

目录 第一章&#xff1a;Java Web基础知识1.介绍3.Java Web基本概念 4.常见面试问题第二章&#xff1a;Java Web核心概念和技术1.介绍3.Servlet和JSP4.Web安全5.常见面试问题 第三章&#xff1a;Java Web高级概念和技术1.介绍3.Spring框架4.安全性5.常见面试问题 第四章&#x…...

2023-08-05力扣今日二题

链接&#xff1a; 剑指 Offer 18. 删除链表的节点 题意&#xff1a; 如题 解&#xff1a; 基础链表操作 实际代码&#xff1a; #include<iostream> using namespace std; struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {} }; Li…...

stl_list类(使用+实现)(C++)

list 一、list-简单介绍二、list的常用接口1.常见构造2.iterator的使用3.Capacity和Element access4.Modifiers5.list的迭代器失效 三、list实现四、vector 和 list 对比五、迭代器1.迭代器的实现2.迭代器的分类&#xff08;按照功能分类&#xff09;3.反向迭代器(1)、包装逻辑…...

利用hfish反控境外攻击源主机

导师给了7个网络安全课题选题&#xff0c;本想和他聊了下思路&#xff0c;他一挥手让我先做出点东西再来聊就把我打发走了…… 正好前段时间阿里云到校做推广&#xff0c;用优惠卷薅了一台云服务器&#xff0c;装了hfish先看下情况 没想到才装上没两天数据库就爆了&#xff0…...

4、Rocketmq之存储原理

CommitLog ~ MappedFileQueue ~ MappedFile集合...

在线原型设计工具有好用的吗?就是这10个

随着设计工作的不断发展&#xff0c;原型设计在设计工作中越来越重要&#xff0c;而在线原型设计工具在减轻了设计师工作负担的同时也提高了设计师的工作效率&#xff0c;今天本文将为大家推荐10个能在线使用的原型设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 …...

Vc - Qt - QPainter translate

QPainter的translate()函数是用来对绘制坐标系统进行平移操作的方法。它可以将绘制的原点&#xff08;坐标轴的起始点&#xff09;在水平和垂直方向上进行平移。以下是一个使用QPainter的translate()方法进行坐标平移的示例代码&#xff1a; QPainter painter(this);// 绘制一个…...

Spark Catalog详解

前言 旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行批量删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗? 我:你应该静下心来好好把spark基础知识进行全面学习。 实习生:难道spark有这功能,而我没有学习过?咋弄啊? 我:…...

【Spring专题】手写简易Spring容器过程分析

前置知识 《【Spring专题】Spring底层核心原理解析》 思路整理 我们在上一节《【Spring专题】Spring底层核心原理解析》课里面有简单分析过一个Spring容器的一般流程&#xff0c;所以&#xff0c;本节课我们这里尝试写一下简易的Spring容器。 手写源码示例 一、手写前的准…...

fastadmin自定义键值组件Fieldlist

需求场景&#xff1a; 后台设置前端的固定话费充值金额。编辑时要求能够增删改&#xff0c;给到前端的数据&#xff0c;是要根据金额正序排列&#xff0c;用fastadmin的键值组件(Fieldlist)&#xff0c;使用Art-Template模板语法自定义模板。 最终效果如下图所示&#xff1a; …...

yolov2检测网数据集标注_labelme使用_json2txt格式转换

yolov2检测网数据集标注_labelme使用_json2txt格式转换 一、安装Anaconda二、创建labelme虚拟环境三、使用labelme标注健康非健康猫狗数据3.1 打开数据集所在文件夹3.2 进行标注数据集3.3 json2txt3.4 按文件目录和训练测试数据集重分配 四、数据喂给服务器网络参考链接 一、安…...

C/C++面试总结

一、关键字static、const、extern、volatile作用 1、const 1.修饰常量 用const修饰的变量是不可变的&#xff0c;修饰后的变量只能使用&#xff0c;不能修改。 2.修饰指针 如果const位于*的左侧&#xff0c;eg&#xff1a;const int* a&#xff0c;则const就是用来修饰指针…...

Python爬虫的Selenium(学习于b站尚硅谷)

目录 一、Selenium  1.为什么要学习Selenium  &#xff08;1&#xff09;什么是Selenium  &#xff08;2&#xff09;为什么使用selenium?  &#xff08;3&#xff09;代码演示 2. selenium的基本使用  &#xff08;1&#xff09;如何安装selenium  &#xff08;2…...

springboot 对接 minio 分布式文件系统

1. minio介绍 Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口&#xff0c;可以看做是是S3的开源版本&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象…...

前端小练习:案例4.3D图片旋转展示(旋转木马)

一.效果预览图 二.实现思路 1.实现旋转木马效果的第一步是先准备好自己需要的图片&#xff0c;创建html文件 2.旋转木马的实现&#xff0c;关键点在3D形变和关键帧动画。 3.步骤&#xff0c;定义一个div使其居中&#xff0c;&#xff0c;把图片放进div盒子里&#xff0c;因为图…...

Linux这17个操作技巧是每个运维工程师应知必会的吧?

今天跟大家分享17个linux运维中常用的操作技巧&#xff01;掌握好这些技巧&#xff0c;或许某一天能够让老板给你涨工资&#xff01; 1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录&#xff1a; find . -name “*.tar” -exec mv {}./backup/ ; ❝ 注解&#xff1…...

解决PySide6中Qt Designer UI空白问题

在使用PySide6开发桌面应用程序时,经常会遇到将Qt Designer设计的UI文件集成到Python代码中的问题。本文将通过一个实际案例来探讨如何解决UI显示空白的问题。 问题背景 假设你已经用Qt Designer设计了一个复杂的用户界面,包含了多个标签页(QTabWidget),每个标签页内有可…...

WarcraftHelper兼容性技术方案:让经典游戏在现代系统重生的实战指南

WarcraftHelper兼容性技术方案&#xff1a;让经典游戏在现代系统重生的实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 1. 兼容性问题的技术根…...

Godot引擎资源提取完全指南:从PCK文件到资产复用的技术实践

Godot引擎资源提取完全指南&#xff1a;从PCK文件到资产复用的技术实践 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 技术挑战速览 核心问题解决方案预览技术价值如何识别有效PCK文件&#xff1f…...

AI 焦虑别乱投!3 个问题秒懂要不要养「虾」

作者 | 张辉清 责编 | 梦依丹出品 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09;当下 AI 热度居高不下&#xff0c;企业该如何抉择&#xff1f;是大举投入布局&#xff0c;还是保持观望&#xff1f;我们借以下三个问题来展开思考。AI 当下处在什么阶段&#xf…...

Emgu CV轮廓检测避坑指南:RetrType模式选择与效果对比

Emgu CV轮廓检测避坑指南&#xff1a;RetrType模式选择与效果对比 在计算机视觉项目中&#xff0c;轮廓检测往往是物体识别、形状分析的关键第一步。作为OpenCV的.NET封装&#xff0c;Emgu CV提供了强大的轮廓检测功能&#xff0c;但许多开发者在使用FindContours函数时&#x…...

python的模块和包

模块&#xff1a;1&#xff1a;在python里一个.py文件就是一个模块&#xff08;module)2&#xff1a;模块可以包含&#xff1a;变量&#xff0c;函数&#xff0c;方法等许多内容3&#xff1a;通常把能够实现特定功能的代码&#xff0c;集中放在一个模块里4&#xff1a;模块可以…...

零下20度实测:国产SysMax PCAN FD在寒区标定中的稳定性与兼容性全记录

零下20度极限挑战&#xff1a;SysMax PCAN FD在寒区汽车电子标定中的实战全解析 当清晨的内蒙古满洲里气温骤降至-20℃&#xff0c;大多数电子设备早已进入"冬眠"状态&#xff0c;而我们的汽车电子标定工作却必须继续。在这个被称为"中国冷极"的地区&#…...

ai辅助开发新体验:在快马平台用对话创建智能天气应用

最近在做一个天气应用的小项目时&#xff0c;遇到了一个很实际的问题&#xff1a;GitHub经常打不开&#xff0c;导致想参考的开源代码库无法访问。这时候&#xff0c;我发现InsCode(快马)平台的AI辅助开发功能简直是个救星&#xff0c;完全改变了我的开发方式。 需求分析阶段 以…...

给OpenClaw小龙虾喂点 “数据库饲料”,它竟能替你加班到天亮?

目录 &#x1f4a1;DBA 的痛&#xff0c;龙虾不懂 &#x1f99e; 给“龙虾”喂点“硬菜” &#x1f4cd; 成为首批体验官&#xff0c;有福利 最近大家都在养龙虾。 龙虾越养越聪明&#xff0c;写代码、查资料、做分析……什么都能干。 但有一件事&#xff0c;现在的龙虾还…...

腾讯 CodeBuddy 全形态解析:IDE、CLI 与插件如何重塑 AI 编程体验

1. CodeBuddy 三形态全景解析&#xff1a;从终端到桌面的AI编程革命 第一次用CodeBuddy的CLI工具时&#xff0c;我在终端里输入"帮我写个Python爬虫抓取天气数据"&#xff0c;三秒钟后看着自动生成的完整代码&#xff0c;手里的咖啡差点洒在键盘上。这就是腾讯CodeB…...