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

websocket深入-webflux+websocket

文章目录

  • 背景
  • 版本约定
  • 配置文件
  • 代码
    • 使用webflux
    • 使用websocket
      • 配置文件
      • handler基类
      • 实现类
      • 注册路由

背景

基于更复杂的情况和更高的开发要求,我们可能会遇到必须同时要使用webflux和websocket的情况。

版本约定

  • JDK21
  • Springboot 3.2.0
  • Fastjson2
  • lombok

配置文件

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.0</version>
</parent>
<properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencies><!-- Spring Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.54</version></dependency>
</dependencies>

代码

只要引入webflux,就同时引入了websocket,不需要再次引入websocket

使用webflux

@RestController
@RequestMapping("/user")
public class UserFlux {@Autowiredprivate UserService userService;@GetMapping("/get")public Mono<Result<User>> get() {return Mono.just(Result.httpSuccess(userService.getUser()));}/*** 服务器推送** @return 由服务器决定推送多少次多少数据,推送结束前不会断开连接** @apiNote (SSE - > Server Send Event)*/@GetMapping(value = "/flux", produces = MediaType.APPLICATION_JSON_VALUE)public Flux<String> flux() {return Flux.fromStream(IntStream.range(1, 5).mapToObj(i -> {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException ignored) {}JSONObject obj = new JSONObject();obj.put("data", "hello,flux" + i);return obj.toJSONString();}));}
}

这里比较值得注意的是Flux返回值,这个返回值从性质上说有点像会自动close的websocket。我们看下这个/flux的返回值:


{"data": "hello,flux1"
}{"data": "hello,flux2"
}{"data": "hello,flux3"
}{"data": "hello,flux4"
}

注意这不是我拼接的,是调试结果就是这样。也就是说,/flux是分帧输出,具有流式的特性。

使用websocket

这里选择使用手动注册websocket而非Endpoint自动注解,主要是因为我想对handler做规范化

配置文件

@Configuration(proxyBeanMethods = false)
public class ReactiveWebSocketConfiguration {@Beanpublic WebSocketHandlerAdapter webSocketHandlerAdapter() {return new WebSocketHandlerAdapter();}
}

handler基类

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.NonNull;
import org.springframework.web.reactive.socket.WebSocketHandler;
import org.springframework.web.reactive.socket.WebSocketMessage;
import org.springframework.web.reactive.socket.WebSocketSession;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
// 强制规定基类必须有泛型约束入参出参。强制规定必须进行参数校验
@Slf4j
public abstract class BaseSocketHandler<T, R> implements WebSocketHandler {@Override@NonNullpublic Mono<Void> handle(WebSocketSession session) {String sessionId = session.getId();log.info("与sessionId:【{}】 建立连接", sessionId);Flux<WebSocketMessage> receive = session.receive();Flux<R> fluxHandled = receive.flatMap(webSocketMessage -> {String payloadAsText = webSocketMessage.getPayloadAsText();if (!JSON.isValid(payloadAsText)) {log.error("收取参数不合法:{}", payloadAsText);session.close();throw new IllegalArgumentException("参数不合法");}TypeReference<T> reference = getTypeReference();if (!check(payloadAsText, reference)) {log.error("参数校验不通过:{}", payloadAsText);session.close();throw new IllegalArgumentException("参数校验不通过");}return handler(payloadAsText, reference);}).onErrorResume(throwable -> {log.error("连接异常,即将关闭", throwable);session.close();return Mono.error(throwable);});return session.send(Mono.from(fluxHandled).map(payload -> session.textMessage(JSON.toJSONString(payload))));}public abstract boolean check(String payloadObject, TypeReference<T> typeReference);public abstract Mono<R> handler(String payload, TypeReference<T> typeReference);protected abstract TypeReference<T> getTypeReference();
}

实现类

// 这样继承基类的handler使用时非常简单不说,由于上层做了处置,还会更安全更好做日志
public class NoticeHandler extends BaseSocketHandler<User, UserInfo> {@Overridepublic boolean check(String payloadObject, TypeReference<User> userTypeReference) {User user = JSON.parseObject(payloadObject, userTypeReference);return !Objects.isNull(user.getId()) && user.getId() > 0;}@Overridepublic Mono<UserInfo> handler(String payload, TypeReference<User> typeReference) {User user = JSON.parseObject(payload, typeReference);UserInfo userInfo = new UserInfo();BeanUtils.copyProperties(user, userInfo);return Mono.just(userInfo);}@Overrideprotected TypeReference<User> getTypeReference() {return new TypeReference<>() {};}
}

注册路由

import com.xu.socket.NoticeHandler;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping;
import org.springframework.web.reactive.socket.WebSocketHandler;import java.util.HashMap;
import java.util.Map;@Component
public class ReactiveWebSocketServerHandlerMapping extends SimpleUrlHandlerMapping {public ReactiveWebSocketServerHandlerMapping() {Map<String, WebSocketHandler> map = new HashMap<>();map.put("/ws/notice", new NoticeHandler());setUrlMap(map);setOrder(100);}
}

相关文章:

websocket深入-webflux+websocket

文章目录 背景版本约定配置文件代码使用webflux使用websocket配置文件handler基类实现类注册路由 背景 基于更复杂的情况和更高的开发要求&#xff0c;我们可能会遇到必须同时要使用webflux和websocket的情况。 版本约定 JDK21Springboot 3.2.0Fastjson2lombok 配置文件 &…...

LangChain-输出解析器 (Output Parsers)

输出解析器是LangChain的重要组件&#xff0c;用于将语言模型的原始文本输出转换为结构化数据。本文档详细介绍了输出解析器的类型、功能和最佳实践。 概述 语言模型通常输出自然语言文本&#xff0c;但在应用开发中&#xff0c;我们经常需要将这些文本转换为结构化的数据格式…...

wsl2+ubuntu22.04安装blenderproc教程

本章教程,介绍如何在windows操作系统上通过wsl2+Ubuntu22.04上安装blenderproc。 一、pipi安装方式 推荐使用minconda3安装Python环境。 pip install Blenderproc二、源码安装 1、下载源码 git clone https://github.com/DLR-RM/BlenderProc2、安装依赖 cd BlenderProc &am…...

矩阵热图】】

一、基础热图绘制 import matplotlib.pyplot as plt import numpy as np# 模拟数据生成 matching_history [np.random.randint(0, 2, (5, 3)) for _ in range(4)] # 5个UE&#xff0c;3个边缘服务器&#xff0c;4次迭代# 绘制最终匹配矩阵 plt.figure(figsize(10, 6)) plt.i…...

opencv人脸性别年龄检测

一、引言 在计算机视觉领域&#xff0c;人脸分析是一个热门且应用广泛的研究方向。其中&#xff0c;人脸性别年龄检测能够自动识别图像或视频流中人脸的性别和年龄信息&#xff0c;具有诸多实际应用场景&#xff0c;如市场调研、安防监控、用户个性化体验等。OpenCV 作为一个强…...

idea里面不能运行 node 命令 cmd 里面可以运行咋回事啊

idea里面不能运行 node 命令 cmd 里面可以运行咋回事啊 在 IntelliJ IDEA&#xff08;或其他 JetBrains 系列 IDE&#xff09;中无法运行某些命令&#xff0c;但在系统的命令提示符&#xff08;CMD&#xff09;中可以正常运行&#xff0c;这种情况通常是由于以下原因之一导致的…...

【ROS】软件包后期添加依赖

【ROS】软件包后期添加依赖 前言整体思路修改 package.xml1. 构建依赖&#xff08;build_depend&#xff09;2. 构建导出依赖&#xff08;build_export_depend&#xff09;3. 运行依赖&#xff08;exec_depend&#xff09;如何修改 修改 CMakeLists.txt修改 find_package其他修…...

十三届蓝桥杯Java省赛 B组(持续更新..)

目录 十三届蓝桥杯Java省赛 B组第一题&#xff1a;星期计算第二题&#xff1a;山第三题&#xff1a;字符统计第四题&#xff1a;最少刷题数第五题&#xff1a;求阶乘第六题&#xff1a;最大子矩阵第七题&#xff1a;数组切分第八题&#xff1a;回忆迷宫第九题&#xff1a;红绿灯…...

生成式人工智能的价值回归:重塑技术、社会与个体的发展轨迹

在数字化浪潮的席卷之下,生成式人工智能(Generative AI)正以前所未有的速度重塑人类社会的面貌。这项技术不仅被视为人工智能发展的新阶段,更被赋予了推动生产力跃升、加速社会形态变革的历史使命。生成式人工智能的价值回归,不仅体现在技术本身的革新与突破,更在于其对个…...

【工具开发教程】通过批量OCR识别PDF扫描件中的文本,给PDF批量重命名,基于WPF和阿里云的实现方案,超详细

以下是基于WPF和阿里云实现批量OCR识别PDF扫描件中的文本,并给PDF批量重命名的项目方案,包含项目背景、界面设计、代码步骤和开发总结。 一、项目背景 在日常办公或学习中,处理大量PDF扫描件时,常常需要手动提取文件中的文本内容并重命名文件。这种方式效率低下且容易出错…...

AI 重构 Java 遗留系统:从静态方法到 Spring Bean 注入的自动化升级

在当今快速发展的软件行业中&#xff0c;许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法&#xff0c;随着业务的不断发展&#xff0c;其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具&#xff0c;为 Java 遗留系统的重构提供了…...

JS—同源策略:2分钟掌握同源策略

个人博客&#xff1a;haichenyi.com。感谢关注 一. 目录 一–目录二–什么是“同源”&#xff1f;三–同源策略的限制范围​四–允许跨源的场景​五–如何绕过同源策略&#xff08;安全方式&#xff09;​六–同源策略的安全意义​七–总结 二. 什么是“同源”&#xff1f; …...

【C++】关于scanf是否需要使用的快速记忆

在 C 语言中&#xff0c;scanf 函数用于从标准输入读取数据并存储到变量中。scanf 函数需要知道变量的内存地址&#xff0c;以便将输入的数据存储到正确的内存位置。这就是为什么在大多数情况下需要使用 & 符号的原因。 1. 为什么需要使用& & 符号用于获取变量的内…...

BUUCTF-web刷题篇(19)

28.CheckIn 源码&#xff1a; #index.php <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&q…...

国家优青ppt美化_青年科学基金项目B类ppt案例模板

国家优青 国家优青&#xff0c;全称“国家优秀青年基金获得者”。2025改名青年科学基金B类。 作为自然基金人才资助类型&#xff0c;支持青年学者在基础研究方面自主选择研究方向开展创新研究。它是通往更高层次科研荣誉的重要阶梯&#xff0c;是准杰青梯队。 / WordinPPT /…...

【HTML】动态背景效果前端页面

下面是一个带有多种动态背景效果的现代化前端页面&#xff0c;包含粒子效果、渐变波浪和星空背景三种可选动态背景。直接上代码&#xff01;! <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name&quo…...

前端面试宝典---创建对象的配置

Object.create 对整个对象的多个属性值进行配置 创建对象 不可更改属性值 // 创建对象 不可更改属性值 let obj Object.create({}, {name: {value: lisi,writable: false,},age: {value: 20,writable: true,} })console.log(初始化obj, obj) obj.name wangwu console.log(…...

Linux重启命令(Linux Restart Command)

Linux重启命令&#xff1a;深入了解reboot、shutdown、init和systemctl 在Linux系统中&#xff0c;重启系统是一个常见的操作&#xff0c;可以通过多种命令来实现。以下是一些常用的重启命令及其区别&#xff1a; reboot 这是一个非常通用的命令&#xff0c;用于重启系统。 它…...

UML-饮料自助销售系统(饮料已售完)序列图

一、题目&#xff1a; 在饮料自动销售系统中&#xff0c;顾客选择想要的饮料。系统提示需要投入的金额&#xff0c;顾客从机器的前端钱币口投入钱币&#xff0c;钱币到达钱币记录仪&#xff0c;记录仪更新自己的选择。正常时记录仪通知分配器分发饮料到机器前端&#xff0c;但可…...

第7课:智能体安全与可靠性保障

智能体安全与可靠性保障&#xff1a;从攻击防御到隐私保护的全栈实践 一、引言&#xff1a;当智能体走向开放世界&#xff1a;安全为何成为协作的“生命线” 随着多智能体系统&#xff08;MAS&#xff09;在金融、医疗、自动驾驶等关键领域的落地&#xff0c;安全风险呈指数级…...

前端性能优化核弹级方案:CSS分层渲染+Wasm,首屏提速300%!

前端性能优化核弹级方案&#xff1a;CSS分层渲染Wasm实现首屏提速300%的终极指南 在当今Web应用日益复杂的背景下&#xff0c;性能优化已成为前端开发的核心竞争力。本文将深入剖析两种革命性的前端性能优化技术——CSS分层渲染与WebAssembly(Wasm)的协同应用&#xff0c;揭示…...

有一个服务器能做什么?

服务器对于程序员来说就是一个超级便利的机器&#xff0c;可以用自己的知识来做出许多的使用场景。 搭建网站和应用程序 个人网站&#xff1a;可以创建个人博客、作品集网站或简历网站等&#xff0c;用于展示个人才华、分享经验和知识。 企业网站&#xff1a;为企业搭建官方…...

华为RH2288H V3服务器极速重装:从RedHat到openEuler 24超详细重装指南

1 登录iBMC口 2 配置启动项 点击&#xff1a;配置&#xff0c;点击&#xff1a;系统启动项 点击&#xff1a;单次有效&#xff0c;选择&#xff1a;光驱&#xff0c;点击&#xff1a;保存 3 进Remote Contro 点击&#xff1a;远程控制&#xff0c;进入如下界面 点击&#xff1…...

AI集群设计

关键要素 硬件选型 计算节点&#xff1a;通常选用配备高性能 GPU&#xff08;如 NVIDIA A100、H100 等&#xff09;的服务器&#xff0c;以提供强大的并行计算能力&#xff0c;加速深度学习模型的训练和推理过程。网络设备&#xff1a;采用高速网络&#xff0c;如 InfiniBand …...

NginxWebUI:可视化 Nginx 配置管理工具,告别繁琐命令行!

文章目录 &#x1f4cc;前言1. NginxWebUI 是什么&#xff1f;2. NginxWebUI 核心功能3. 如何安装 NginxWebUI&#xff1f;3.1 Docker 安装&#xff08;推荐&#xff09;3.2 Java Jar 运行 4. NginxWebUI 基本使用教程4.1 登录与初始化4.2 配置反向代理4.3 管理 SSL 证书4.4 查…...

深入理解 GLOG_minloglevel 与 GLOG_v:原理与使用示例

文章目录 深入理解 GLOG_minloglevel 与 GLOG_v&#xff1a;原理与使用示例1. GLOG_minloglevel&#xff1a;最低日志等级控制2. GLOG_v&#xff1a;控制 VLOG() 的详细输出等级3. GLOG_minloglevel 与 GLOG_v 的优先级关系4. 使用示例4.1 基础示例&#xff1a;不同日志等级4.2…...

移动端六大语言速记:第12部分 - 测试与优化

移动端六大语言速记:第12部分 - 测试与优化 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在测试与优化方面的特性,帮助开发者理解和掌握各语言的测试框架和性能优化技巧。 12. 测试与优化 12.1 单元测试框架对比 各语言单元测试框架…...

ubuntu2204安装显卡驱动+多版本的cuda+cudnn+多版本tensorRT

cuda的版本更新速度很快&#xff0c;这也带动TensorRT的更新速度。TensorRT SDK的更新直接从版本8升级到版本10(其实有版本9&#xff0c;和8相比没有大的改变)。tensorRT部署模型的很多接口都发生了较大的改变。为了体验不同版本的cuda和tensorRT的推理&#xff0c;本文考虑在u…...

从One-Hot到TF-IDF:NLP词向量演进解析与业务实战指南

从One-Hot到TF-IDF&#xff1a;词向量演进之路 开场白&#xff1a; 想象一下&#xff0c;你试图用Excel表格分析《红楼梦》的情感倾向——每个字词都是孤立的单元格&#xff0c;计算机看到的只有冰冷的0和1&#xff0c;而“黛玉葬花”的凄美意境却消失得无影无踪。这就是NLP工…...

Ubuntu下载火狐浏览器

在 Ubuntu 中卸载 Firefox 浏览器的方法取决于其安装方式&#xff08;通过 APT 包管理器 或 Snap&#xff09;。以下是详细的步骤&#xff1a; 1. 确认 Firefox 的安装方式 首先检查 Firefox 是通过哪种方式安装的&#xff1a; # 检查 Snap 版本 snap list | grep firefox# 检…...

C++ - 数据容器之 unordered_map(声明与初始化、插入元素、访问元素、遍历元素、删除元素、查找元素)

一、unordered_map unordered_map 是 C STL 中的一个关联容器&#xff0c;它有如下特点 unordered_map 存储键值对&#xff0c;使用哈希表实现 unordered_map 的每个键在容器中只能出现一次 unordered_map 的存储的键值对是无序的 平均情况下&#xff0c;查找、插入、删除都…...

什么是具身智能?其发展五大趋势预测

3月29-30日&#xff0c;由中国人工智能学会主办的第二届中国具身智能大会&#xff08;CEAI 2025&#xff09;在北京海淀成功召开。中国科学院院士、南京大学党委书记谭铁牛在大会作题为“具身智能&#xff1a;学科交叉的新前站”的主题演讲。他表示&#xff0c;具身智能是发展人…...

智能指针的使用及其原理(C++)

1. 智能指针的使用场景分析 通过下面的例子来分析&#xff1a; double Divide(int a, int b) {// 当b 0时抛出异常if (b 0){throw "Divide by zero condition!";}else{return (double)a / (double)b;} }void Func() {int* array1 new int[10];int* array2 new …...

使用 react-three-fiber 快速重构 Three.js 场景⚛️

不明白的知识先放在一边&#xff0c;激发兴趣是第一步&#xff0c;所以不必纠结代码的细节&#xff0c;相信我你很快就会爱上这种感觉&#xff01;&#xff01;&#xff01; 今天&#xff0c;我们将更进一步&#xff0c;将上一篇中vite npm传统 Three.js 原生代码完整 重构为 …...

索尼相机视频文件格式规格

XAVC&#xff0c;作为Sony所独有的一种视频编码格式&#xff0c;具有其独特的压缩技术。其中&#xff0c;L代表的是Long GOP压缩方式&#xff0c;这种方式在视频编码中&#xff0c;侧重于实现帧间的高效压缩&#xff0c;以提升整体的编码效率。而I则对应着Intra压缩方式&#x…...

Audacity命令:“文件”菜单相关命令

1 Audacity命令&#xff1a;“文件”菜单相关命令 文件菜单提供用于创建、打开和保存 Audacity 项目以及导入和导出音频文件的命令。 1.1 文件菜单命令列表 文件菜单一级菜单的命令列表 Scripting IdActionParameters描述New:New无创建一个新的空白项目窗口&#xff0c;用于处…...

chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号

背景: 在内网搭建的服务, 由于https证书问题, 可能会被chrome浏览器提示不安全 此时, 默认的记住账号密码功能就无法使用, 那么此时只能手动输入了吗? 想到了几种方案 1.利用外置软件, 模拟按键输入(比如按键精灵, 缺点是依赖外部软件, 运行速度也慢, 且执行时占用了输入焦…...

ubuntu18.04安装miniforge3

1.下载安装文件 略&#xff08;注&#xff1a;从同事哪里拖来的安装包&#xff09; 2.修改安装文件权限 chmod x Miniforge3-Linux-x86_64.sh 3.将它安装到指定位置 micromamba activate /home/xxx/fxp/fromDukto/miniforge3 4.激活 /home/xxx/fxp/fromDukto/miniforge3…...

Flutter容器组件深度解析

引言 在 Flutter 开发中&#xff0c;容器组件是构建用户界面的基石。它们为开发者提供了强大而灵活的方式来组织和布局界面元素。通过使用容器组件&#xff0c;开发者可以轻松地控制子组件的大小、位置、边距、背景等属性&#xff0c;从而创建出美观、易用且响应式的界面。本文…...

Java 实现 List<String> 与 String 互转

在 Java 开发过程中&#xff0c;有时需要将 List<String> 转为 String 存储&#xff0c;后续使用时再还原回去。此时就需要 Java 实现 List<String> 与 String 互转。以下是一种互转方式。 采用如下工具包实现。 <dependency><groupId>org.apache.com…...

无人设备遥控器之数据分析与处理篇

无人设备遥控器的数据分析与处理是提升设备智能化水平和操作效率的关键环节。以下从数据采集、预处理、分析方法、处理技术、应用场景五个方面展开分析&#xff1a; 一、数据采集 无人设备遥控器通过多种方式采集数据&#xff0c;主要包括&#xff1a; 控制信号数据&#xf…...

【Django】教程-14-验证码+登录页

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...

flask实现上传文件与下载文件

以下是一个使用Python Flask实现的文件上传和下载服务的完整步骤及代码示例:供参 功能说明: 上传文件: POST请求到/upload端点 需要包含一个名为file的文件参数 支持的文件类型包括:txt, pdf, png, jpg, jpeg, gif, doc, docx, xlsx, zip 返回上传成功信息和下载链接 下载…...

用Java写一个MVCC例子

MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是一种用于数据库管理系统中处理并发访问数据的技术。它允许事务在查询时看到数据的一个快照版本&#xff0c;而不是直接查看最新的提交数据。这种方法不仅提高了并发性能&#xff0c…...

【遥感科普】卫星影像产品处理等级有哪些?

遥感数据等级划分是指将卫星遥感原始数据按处理深度分为不同等级&#xff0c;用户可快速匹配需求&#xff1a;初级数据适合算法开发&#xff0c;高级产品可直接用于分析。分级体系促进数据标准化&#xff0c;降低使用门槛&#xff0c;提升跨机构协作效率&#xff1b;同时便于质…...

第十二天 - Flask/Django基础 - REST API开发 - 练习:运维管理后台API

从零开始用Flask/Django构建运维管理后台API&#xff08;实战指南&#xff09; 前言&#xff1a;为什么选择Python Web框架&#xff1f; 在运维自动化领域&#xff0c;构建管理后台是每个运维工程师的必修课。本文将通过Flask和Django两个主流框架&#xff0c;手把手教你构建…...

计算机视觉与深度学习 | 视觉里程计(Visual Odometry, VO)学习思路总结

视觉里程计(Visual Odometry, VO)学习思路总结 视觉里程计(VO)是通过摄像头捕获的图像序列估计相机运动轨迹的技术,广泛应用于机器人、自动驾驶和增强现实等领域。以下是一个系统的学习路径,涵盖基础理论、核心算法、工具及实践建议:一、基础理论与数学准备 核心数学工具…...

解决vite.config.ts 引入scss 预处理报错

版本号&#xff1a; "sass": "^1.86.3","sass-loader": "^16.0.5","vite": "^6.2.0" 报错图片&#xff1a; vite.config.ts 一开始文件错误 修改之后&#xff1a;完美解决报错&#xff08;不过我还没搞懂为什么…...

Design Compiler:中断命令/脚本的执行

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 中断命令的执行 如果在使用命令时输入了错误的选项或输入了错误的命令&#xff0c;可以使用CtrlC手动中断命令的执行并返回到dc_shell中&#xff0c;此时终端…...

图灵逆向——题十七-字体加密

十七题是一个很经典的字体加密案例&#xff0c;很适合新手入门~ 目录列表 过程分析代码实现 过程分析 打开开发者工具直接看请求&#xff0c;发现它请求的没有加密参数&#xff0c;以为万事大吉的你迫不及待的点击了响应&#xff0c;然后就会发现依托。。。 返回的数据中字体…...