SpringBoot中使用kaptcha生成验证码

简介

kaptcha是谷歌开源的简单实用的验证码生成工具。通过设置参数,可以自定义验证码大小、颜色、显示的字符等等。

Maven引入依赖

	<!-- https://mvnrepository.com/artifact/pro.fessional/kaptcha --><dependency><groupId>pro.fessional</groupId><artifactId>kaptcha</artifactId><version>2.3.3</version></dependency>

新增配置类

  • CaptchaConfig.java
package com.example.learn.config;import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Properties;import static com.google.code.kaptcha.Constants.*;@Configuration
public class CaptchaConfig {@Bean(name = "captchaProducer")public DefaultKaptcha getKaptchaBean(){DefaultKaptcha defaultKaptcha = new DefaultKaptcha();Properties properties = new Properties();// 是否有边框 默认为true 我们可以自己设置yes,noproperties.setProperty(KAPTCHA_BORDER, "yes");// 验证码文本字符颜色 默认为Color.BLACKproperties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");// 验证码图片宽度 默认为200properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");// 验证码图片高度 默认为50properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");// 验证码文本字符大小 默认为40properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");// KAPTCHA_SESSION_KEYproperties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");// 验证码文本字符长度 默认为5properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpyproperties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");Config config = new Config(properties);defaultKaptcha.setConfig(config);return defaultKaptcha;}@Bean(name = "captchaProducerMath")public DefaultKaptcha getKaptchaBeanMath(){DefaultKaptcha defaultKaptcha = new DefaultKaptcha();Properties properties = new Properties();// 是否有边框 默认为true 我们可以自己设置yes,noproperties.setProperty(KAPTCHA_BORDER, "yes");// 边框颜色 默认为Color.BLACKproperties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");// 验证码文本字符颜色 默认为Color.BLACKproperties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");// 验证码图片宽度 默认为200properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");// 验证码图片高度 默认为50properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");// 验证码文本字符大小 默认为40properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");// KAPTCHA_SESSION_KEYproperties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");// 验证码文本生成器 【这个要修改为自己项目的包路径】properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.example.learn.config.KaptchaTextCreator");// 验证码文本字符间距 默认为2properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");// 验证码文本字符长度 默认为5properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");// 验证码噪点颜色 默认为Color.BLACKproperties.setProperty(KAPTCHA_NOISE_COLOR, "white");// 干扰实现类properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpyproperties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");Config config = new Config(properties);defaultKaptcha.setConfig(config);return defaultKaptcha;}
}
  • KaptchaTextCreator
package com.example.learn.config;import com.google.code.kaptcha.text.impl.DefaultTextCreator;import java.util.Random;/*** 验证码文本生成器** @author ruoyi*/
public class KaptchaTextCreator extends DefaultTextCreator
{private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(",");@Overridepublic String getText(){Integer result = 0;Random random = new Random();int x = random.nextInt(10);int y = random.nextInt(10);StringBuilder suChinese = new StringBuilder();int randomoperands = random.nextInt(3);if (randomoperands == 0){result = x * y;suChinese.append(CNUMBERS[x]);suChinese.append("*");suChinese.append(CNUMBERS[y]);}else if (randomoperands == 1){if ((x != 0) && y % x == 0){result = y / x;suChinese.append(CNUMBERS[y]);suChinese.append("/");suChinese.append(CNUMBERS[x]);}else{result = x + y;suChinese.append(CNUMBERS[x]);suChinese.append("+");suChinese.append(CNUMBERS[y]);}}else{if (x >= y){result = x - y;suChinese.append(CNUMBERS[x]);suChinese.append("-");suChinese.append(CNUMBERS[y]);}else{result = y - x;suChinese.append(CNUMBERS[y]);suChinese.append("-");suChinese.append(CNUMBERS[x]);}}suChinese.append("=?@" + result);return suChinese.toString();}
}

简单使用

后端控制器

  • CaptchaController
package com.example.learn.controller;import cn.hutool.core.util.IdUtil;
import com.example.learn.common.returns.CommonResult;
import com.google.code.kaptcha.Producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.concurrent.TimeUnit;/***  验证码操作处理*/@RestController
public class CaptchaController {@Resource(name = "captchaProducer")private Producer captchaProducer;@Resource(name = "captchaProducerMath")private Producer captchaProducerMath;/*    @Autowiredprivate StringRedisTemplate redisTemplate;*/// 验证码类型可以是char/mathpublic static String CAPTCHA_TYPE = "char";public static String CAPTCHA_KEY_PREFIX = "captcha:";@GetMapping(value = "/captchaImage")public CommonResult captchaImage() {String capStr = null;String code = null;BufferedImage image = null;if ("math".equals(CAPTCHA_TYPE)) {// 1+2=?@3String capText = captchaProducerMath.createText();capStr = capText.substring(0, capText.lastIndexOf("@"));code = capText.substring(capText.lastIndexOf("@") + 1);image = captchaProducerMath.createImage(capStr);} else if ("char".equals(CAPTCHA_TYPE)) {capStr = code = captchaProducer.createText();image = captchaProducer.createImage(capStr);}// 转换流信息写出ByteArrayOutputStream os = new ByteArrayOutputStream();try {ImageIO.write(image,"jpg",os);} catch (IOException e) {return CommonResult.error(e.getMessage());}// 若用到了redis,放开下面注释代码,并且联调时前端需要把返回的uuid传回来String uuid = IdUtil.simpleUUID();/*String captchaKey = CAPTCHA_KEY_PREFIX + uuid;// 将code到redis中redisTemplate.opsForValue().set(captchaKey,code,2, TimeUnit.MINUTES);*/CommonResult commonResult = CommonResult.success();commonResult.put("uuid",uuid);commonResult.put("img", Base64.getEncoder().encodeToString(os.toByteArray()));return commonResult;}
}

前端页面

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>显示 Base64 图片</title><style>.container {max-width: 800px;margin: 0 auto;padding: 20px;}.image-container {margin-top: 20px;text-align: center;}img {max-width: 100%;height: auto;border: 1px solid #ddd;border-radius: 4px;}</style>
</head>
<body><div class="container"><h1>显示 Base64 图片</h1><div class="image-container"><img id="base64Image" src="" alt="Base64 图片"></div><button onclick="loadImage()">加载图片</button></div><script>// 模拟从后端获取的 Base64 数据function getBase64ImageData() {// 这里是一个示例的 Base64 图片数据(一个简单的 PNG 图片)return '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';}// 加载图片function loadImage() {const base64Data = getBase64ImageData();const img = document.getElementById('base64Image');img.src = 'data:image/jpg;base64,' + base64Data;}// 页面加载时直接显示图片window.onload = function() {loadImage();};</script>
</body>
</html>

说明: 将后端接口返回的img的值复制到前端页面的 function getBase64ImageData()中

效果:

  • 验证码类型:math
    在这里插入图片描述
  • 验证码类型:char
    在这里插入图片描述

其他相关代码

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>learn</artifactId><version>0.0.1-SNAPSHOT</version><name>learn</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.5.15</spring-boot.version><spring-framework.version>5.3.39</spring-framework.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- redis 缓存操作 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>${spring-boot.version}</version></dependency><!-- https://mvnrepository.com/artifact/pro.fessional/kaptcha --><dependency><groupId>pro.fessional</groupId><artifactId>kaptcha</artifactId><version>2.3.3</version></dependency><!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.36</version></dependency></dependencies><dependencyManagement><dependencies><!-- 覆盖SpringFramework的依赖配置--><dependency><groupId>org.springframework</groupId><artifactId>spring-framework-bom</artifactId><version>${spring-framework.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.learn.LearnApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build><repositories><repository><id>public</id><name>aliyun nexus</name><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases></repository></repositories><pluginRepositories><pluginRepository><id>public</id><name>aliyun nexus</name><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></pluginRepository></pluginRepositories></project>
  • CommonResult.java
package com.example.learn.common.returns;import java.util.HashMap;
import java.util.Objects;public class CommonResult extends HashMap<String, Object> {// 状态码public static final String CODE_TAG = "code";// 返回内容public static final String MSG_TAG = "msg";// 数据对象public static final String DATA_TAG = "data";/***  初始化一个新创建的 CommonResult 对象,使其表示一个空消息。*/public CommonResult() {}/*** 初始化一个新创建的 CommonResult 对象* @param code 状态码* @param msg 返回内容*/public CommonResult(int code, String msg) {super.put(CODE_TAG, code);super.put(MSG_TAG, msg);}/*** 初始化一个新创建的 CommonResult 对象** @param code 状态码* @param msg 返回内容* @param data 数据对象*/public CommonResult(int code, String msg, Object data){super.put(CODE_TAG, code);super.put(MSG_TAG, msg);super.put(DATA_TAG, data);}/*** 返回成功消息** @return 成功消息*/public static CommonResult success(){return CommonResult.success("操作成功");}/*** 返回成功数据** @return 成功消息*/public static CommonResult success(Object data){return CommonResult.success("操作成功", data);}/*** 返回成功消息** @param msg 返回内容* @return 成功消息*/public static CommonResult success(String msg){return CommonResult.success(msg, null);}/*** 返回成功消息** @param msg 返回内容* @param data 数据对象* @return 成功消息*/public static CommonResult success(String msg, Object data){return new CommonResult(HttpStatus.SUCCESS, msg, data);}/*** 返回警告消息** @param msg 返回内容* @return 警告消息*/public static CommonResult warn(String msg){return CommonResult.warn(msg, null);}/*** 返回警告消息** @param msg 返回内容* @param data 数据对象* @return 警告消息*/public static CommonResult warn(String msg, Object data){return new CommonResult(HttpStatus.WARN, msg, data);}/*** 返回错误消息** @return 错误消息*/public static CommonResult error(){return CommonResult.error("操作失败");}/*** 返回错误消息** @param msg 返回内容* @return 错误消息*/public static CommonResult error(String msg){return CommonResult.error(msg, null);}/*** 返回错误消息** @param msg 返回内容* @param data 数据对象* @return 错误消息*/public static CommonResult error(String msg, Object data){return new CommonResult(HttpStatus.ERROR, msg, data);}/*** 返回错误消息** @param code 状态码* @param msg 返回内容* @return 错误消息*/public static CommonResult error(int code, String msg){return new CommonResult(code, msg, null);}/*** 是否为成功消息** @return 结果*/public boolean isSuccess(){return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG));}/*** 是否为警告消息** @return 结果*/public boolean isWarn(){return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG));}/*** 是否为错误消息** @return 结果*/public boolean isError(){return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG));}/*** 方便链式调用** @param key 键* @param value 值* @return 数据对象*/@Overridepublic CommonResult put(String key, Object value){super.put(key, value);return this;}
}
  • HttpStatus.java
package com.example.learn.common.returns;/*** 返回状态码* * @author ruoyi*/
public class HttpStatus
{/*** 操作成功*/public static final int SUCCESS = 200;/*** 对象创建成功*/public static final int CREATED = 201;/*** 请求已经被接受*/public static final int ACCEPTED = 202;/*** 操作已经执行成功,但是没有返回数据*/public static final int NO_CONTENT = 204;/*** 资源已被移除*/public static final int MOVED_PERM = 301;/*** 重定向*/public static final int SEE_OTHER = 303;/*** 资源没有被修改*/public static final int NOT_MODIFIED = 304;/*** 参数列表错误(缺少,格式不匹配)*/public static final int BAD_REQUEST = 400;/*** 未授权*/public static final int UNAUTHORIZED = 401;/*** 访问受限,授权过期*/public static final int FORBIDDEN = 403;/*** 资源,服务未找到*/public static final int NOT_FOUND = 404;/*** 不允许的http方法*/public static final int BAD_METHOD = 405;/*** 资源冲突,或者资源被锁*/public static final int CONFLICT = 409;/*** 不支持的数据,媒体类型*/public static final int UNSUPPORTED_TYPE = 415;/*** 系统内部错误*/public static final int ERROR = 500;/*** 接口未实现*/public static final int NOT_IMPLEMENTED = 501;/*** 系统警告消息*/public static final int WARN = 601;
}

参考

  • kaptcha验证码组件
  • RuoYi-Vue-v3.8.9

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

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

相关文章

如何在PHP中实现数据加密与解密:保护敏感信息

如何在PHP中实现数据加密与解密&#xff1a;保护敏感信息 在现代Web开发中&#xff0c;数据安全是一个至关重要的议题。无论是用户的个人信息、支付数据&#xff0c;还是其他敏感信息&#xff0c;都需要在存储和传输过程中进行加密&#xff0c;以防止数据泄露和恶意攻击。PHP作…

单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明

单元测试、系统测试、集成测试、回归测试的梳理说明 单元测试 步骤&#xff1a; 编写测试用例&#xff0c;覆盖代码的各个分支和边界条件。使用测试框架&#xff08;如JUnit、NUnit&#xff09;执行测试。检查测试结果&#xff0c;确保代码按预期运行。修复发现的缺陷并重新测…

C++能力测试题

以下是一些C能力测试题&#xff0c;涵盖了从基础语法到高级特性的多个方面&#xff1a; 选择题 1. 下面关于RTTI的说法&#xff0c;正确的是&#xff1f; A. 使用typeid前必须包含<type_info>头文件。 B. typeid只能用于多态类型或表达式。 C. typeid可以用于不完整类型…

模拟类似 DeepSeek 的对话

以下是一个完整的 JavaScript 数据流式获取实现方案&#xff0c;模拟类似 DeepSeek 的对话式逐段返回效果。包含前端实现、后端模拟和详细注释&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><titl…

【训练细节解读】文本智能混合分块(Mixtures of Text Chunking,MoC)引领RAG进入多粒度感知智能分块阶段

RAG系统在处理复杂上下文时,传统和语义分块方法的局限性,文本分块的质量限制了检索到的内容,从而影响生成答案的准确性。尽管其他算法组件有所进步,但分块策略中的增量缺陷仍可能在一定程度上降低整体系统性能。如何直接量化分块质量?如何有效利用大型语言模型(LLMs)进行…

IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T3【传球游戏】题解

目录 一、提问词 二、DeepSeekR1回复 题目描述 解题思路 实现代码 代码说明 三、说明 【IMADeepSeekR1本地知识库】撰写NOIP2008普及组复赛题解系列 1、IMADeepSeekR1本地知识库撰写NOIP2008普及组T1【ISBN 号码】题解-CSDN博客 2、IMADeepSeekR1本地知识库撰写NOIP200…

Nginx正向代理HTTPS配置指南(仅供参考)

要使用Nginx作为正向代理访问HTTPS网站&#xff0c;需通过CONNECT方法建立隧道。以下是操作详细步骤&#xff1a; 1. 安装Nginx及依赖模块 需要模块&#xff1a;ngx_http_proxy_connect_module&#xff08;支持CONNECT方法&#xff09;。 安装方式&#xff1a;需重新编译Nginx…

Python 实现机器学习的 房价预测回归项目

项目目标&#xff1a; 基于房屋特征&#xff08;如房间数、地理位置等&#xff09;预测加州地区的房价中位数。 使用 Python 实现机器学习的 房价预测回归项目&#xff08;使用 California Housing 数据集&#xff09; 环境准备 # 安装必要库&#xff08;若未安装&#xff09…

聚力·突破·共赢|修饰组学服务联盟正式成立,共启协同发展新篇章

2025年3月13日&#xff0c;上海——由中科新生命、杭州微米生物、广科安德、承启生物、派森诺生物、胡珀生物等十余家行业标杆企业共同发起的“修饰组学服务联盟”成立仪式在上海紫竹新兴产业技术研究院隆重举行。联盟以“聚力突破共赢”为主题&#xff0c;致力于整合修饰组学全…

【Docker项目实战】使用Docker部署serverMmon青蛇探针(详细教程)

【Docker项目实战】使用Docker部署serverMmon青蛇探针 一、serverMmon介绍1.1 serverMmon 简介1.2 主要特点二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载serverMmon镜像五、…

力扣刷题(数组篇)

日期类 #pragma once#include <iostream> #include <assert.h> using namespace std;class Date { public:// 构造会频繁调用&#xff0c;所以直接放在类里面&#xff08;类里面的成员函数默认为内联&#xff09;Date(int year 1, int month 1, int day 1)//构…

【通缩螺旋的深度解析与科技破局路径】

通缩螺旋的深度解析与科技破局路径 一、通缩螺旋的形成机制与恶性循环 通缩螺旋&#xff08;Deflationary Spiral&#xff09;是经济学中描述价格持续下跌与经济衰退相互强化的动态过程&#xff0c;其核心逻辑可拆解为以下链条&#xff1a; 需求端萎缩&#xff1a;居民消费信…

单一责任原则在Java设计模式中的深度解析

在软件开发中&#xff0c;设计模式提供了一种解决特定问题的思路。在众多的设计原则中&#xff0c;单一责任原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;是一个非常重要的概念。它主要强调一个类应该只有一个责任&#xff0c;也就是说&#xf…

开源后台管理系统推荐

前言 在当今数字化时代&#xff0c;企业和组织对于管理和运营资源的需求日益增加。开源后台管理系统应运而生&#xff0c;为用户提供了一个灵活、可定制化的管理平台。本文将介绍开源后台管理系统的概念和优势&#xff0c;探讨常见的开源后台管理系统&#xff0c;以及如何选择…

原生微信小程序实现导航漫游(Tour)

效果&#xff1a; 小程序实现导航漫游 1、组件 miniprogram/components/tour/index.wxml <!--wxml--> <view class"guide" wx:if"{{showGuide}}"><view style"{{guideStyle}}" class"guide-box"><view class&quo…

Docker容器命令速查表

这是 Docker 的快速参考备忘单。 你可以在这里找到最常见的 Docker 命令。 安装 curl -sSL https://get.docker.com/ | sh sudo chmod 777 /var/run/docker.sock在后台创建和运行容器 $ docker run -d -p 80:80 docker/getting-started-d - 以分离&#xff08;后台&#xff0…

Qt QML实现鼠标自由选择不规则区域进行截图

背景 不规则区域进行截图是一种常见的应用场景&#xff0c;通常用于程序截图工具或者图像处理软件中。主要是为了让用户可以自由选择任意形状的区域进行截图&#xff0c;而不仅仅局限于矩形区域。这样用户可以更灵活地进行截图操作&#xff0c;特别是对于需要截取特定形状区域…

SpringDataRedis存储Redis的数据序列化

在使用Spring Data Redis存储数据至Redis时&#xff0c;选择合适的序列化策略至关重要。它不仅影响数据存储的效率和空间利用率&#xff0c;还关系到跨语言兼容性和系统的扩展性。适当的序列化方式可以确保数据正确无误地被存储和读取&#xff0c;提升系统的稳定性和维护性&…

交易系统【三】网关

第二章本来是要讲消息总线&#xff0c;审核说是过度宣传&#xff0c;就放弃了&#xff0c;不纠结&#xff0c;先跳过。 网关和消息总线的底层技术都和网络相关&#xff0c;两者也有很重要的差别。消息总线主要用于内网&#xff0c;受交换机和网卡影响比较大&#xff0c;网络状…

eNSP中路由器的CON/AUX接口、GE Combo接口、Mini USB接口、USB接口、WAN侧uplink接口、FE接口、GE接口介绍

路由器常见接口的详细介绍及其应用示例&#xff1a; 1. CON/AUX 接口 全称&#xff1a;Console/Auxiliary&#xff08;控制台/辅助接口&#xff09;作用&#xff1a; CON&#xff08;Console&#xff09;&#xff1a;通过命令行界面&#xff08;CLI&#xff09;直接配置路由器…