RuoYi前后端分离框架集成手机短信验证码(一)之后端篇

一、背景

本项目基于RuoYi 3.8.9前后端分离框架构建,采用Spring Security实现系统权限管理。作为企业级应用架构的子模块,系统需要与顶层项目实现用户数据无缝对接(以手机号作为统一用户标识),同时承担用户信息采集的重要职能。为此,我们在保留原有账号密码登录方式的基础上,创新性地集成了手机号验证码登录/注册功能,既满足了企业级用户管理的标准化需求,又优化了终端用户的使用体验。

二、短信集成

短信集成可以直接使用短信供应商的SDK,公司目前采购的阿里云短信,短信集成可以直接参照阿里云短信官方文档。当然也可以采用其他更通用一点的集成方式,本人秉持着不重复造轮子同时方便后期短信供应商的变更不再次添加供应商代码,直接采用开源的短信集成工具SM4J,需要了解的可以查看SMS4J官方文档,集成过程如下:

  • 1.添加maven依赖,直接上最新的发布版本:

                <dependency><groupId>org.dromara.sms4j</groupId><artifactId>sms4j-spring-boot-starter</artifactId><version>3.3.5</version></dependency>

  • 2.添加短信配置:

    #短信配置
    sms:# 标注从yml读取配置config-type: yamlHttpLog: truecorePoolSize: 2maxPoolSize: 6queueCapacity: 200blends:# 自定义的标识,也就是configId这里可以是任意值(最好不要是中文)alibaba:#框架定义的厂商名称标识supplier: alibaba#有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。access-key-id: #称为accessSecret有些称之为apiSecret。access-key-secret:#您的短信签名signature: #模板ID 如果不需要简化的sendMessage方法可以不配置template-id: # 随机权重,负载均衡的权重值依赖于此,默认为1,如不需要负载均衡可不进行配置weight: 1#配置标识名称 如果你使用的yml进行配置,则blends下层配置的就是这个,可为空,如果你使用的接口类配置,则需要设置值#需要注意的是,不同的配置之间config-id不能重复,否则会发生配置丢失的问题config-id: alibaba#短信自动重试间隔时间  默认五秒retry-interval: 10# 短信重试次数,默认0次不重试,如果你需要短信重试则根据自己的需求修改值即可max-retries: 2

  • 3.短信发送工具:

    package com.book.framework.sms;import com.book.common.constant.CacheConstants;
    import com.book.common.core.redis.RedisCache;
    import lombok.extern.slf4j.Slf4j;
    import org.dromara.sms4j.api.entity.SmsResponse;
    import org.dromara.sms4j.core.factory.SmsFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;import java.util.LinkedHashMap;
    import java.util.concurrent.ThreadLocalRandom;
    import java.util.concurrent.TimeUnit;/*** @className: SmsService* @author: liuyh* @date: 2025/5/21 17:57* @Version: 1.0*/
    @Slf4j
    @Service
    public class SmsService {/*** 短信服务提供商* {@value CONFIG_ID}*/private static final String CONFIG_ID = "alibaba";@Autowiredprivate RedisCache redisCache;/*** 发送短信** @param phoneNumber* @param message* @return*/public boolean sendSms(String phoneNumber, String message) {SmsResponse smsResponse = SmsFactory.getSmsBlend(CONFIG_ID).sendMessage(phoneNumber, message);boolean beSent = smsResponse.isSuccess();if (!beSent) {log.info("短信服务商错误响应原始消息体: {}", smsResponse.getData());}return beSent;}/*** 发送短信** @param phoneNumber* @param messages* @return*/public boolean sendSms(String phoneNumber, LinkedHashMap<String, String> messages) {SmsResponse smsResponse = SmsFactory.getSmsBlend(CONFIG_ID).sendMessage(phoneNumber, messages);boolean beSent = smsResponse.isSuccess();if (!beSent) {log.info("短信服务商错误响应原始消息体: {}", smsResponse.getData());}return smsResponse.isSuccess();}/*** 发送手机验证方法** @param phoneNumber* @return*/public boolean sendVerificationCode(String phoneNumber) {String code = this.generateAndStoreCode(phoneNumber);LinkedHashMap<String, String> messages = new LinkedHashMap<>();messages.put("code", code);return this.sendSms(phoneNumber, messages);}/*** 生成6位随机验证码并存入Redis* <br>* <b>默认5分钟过期</b>** @param phoneNumber 手机号* @return 生成的验证码*/private String generateAndStoreCode(Str

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

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

相关文章

Java ThreadLocal 应用指南:从用户会话到数据库连接的线程安全实践

ThreadLocal 提供了一种线程局部变量&#xff08;thread-local variables&#xff09;的机制&#xff0c;这意味着每个访问该变量的线程都会拥有其自己独立的、初始化的变量副本。这确保了线程之间不会共享数据&#xff0c;也避免了因共享数据而可能产生的竞争条件和同步问题&a…

GitCode镜像门法律分析:PL协议在中国的司法实践

本文以2022年引发广泛争议的GitCode开源代码镜像事件为研究对象&#xff0c;系统分析公共许可证&#xff08;Public License&#xff0c;PL&#xff09;在中国法律体系下的适用性挑战。通过研究中国法院近五年涉及GPL、Apache、MIT等主流协议的21个司法案例&#xff0c;揭示开源…

Rider崩溃问题终极解决指南

JetBrains Rider 2025.1.2 频繁崩溃问题解决指南 问题描述&#xff1a; 编辑器频繁自动崩溃&#xff0c;任务管理器显示大量 Git for Windows 进程被启动。 原因分析&#xff1a; 这是 Rider 的自动版本控制功能导致的。当检测到代码变更时&#xff0c;编辑器会不断尝试启动 …

4 串电池保护芯片创芯微CM1341-DAT使用介绍

特性 专用于 4 串锂/铁/钠电池的保护芯片&#xff0c;内置有高精度电压检测电路和电流检测电路。通过检测各节电池的电压、充放电电流及温度等信息&#xff0c;实现电池过充电、过放电、均衡、断线、低压禁充、放电过电流、短路、充电过电流和过温保护等功能&#xff0c;放电过…

煤矿电液控制器-底座倾角传感器4K型护套连接器ZE0703-09(100)

煤矿电液控制器作为井下自动化开采的核心设备&#xff0c;其可靠性直接关系到生产安全与效率。在众多关键组件中&#xff0c;底座倾角传感器4K型护套连接器ZE0703-09&#xff08;100&#xff09;凭借独特设计成为保障系统稳定运行的"神经末梢"&#xff0c;其技术特性…

Vue计算属性与监视

在Vue.js中&#xff0c;处理复杂的逻辑和数据依赖关系是构建高效、可维护的前端应用的关键。Vue提供了两种强大的工具来帮助我们实现这一点&#xff1a;计算属性&#xff08;Computed Properties&#xff09; 和 侦听器&#xff08;Watchers&#xff09;。本文将深入探讨这两者…

基于RT-Thread的STM32F4开发第七讲——RTC(硬件、软件)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、RT-Thread工程创建1.硬件RTC配置2.软件RTC配置3.RTC闹钟配置 总结 前言 本章是基于RT-Thread studio实现RTC硬件和软件下的日历时钟功能&#xff0c;开发板…

Java面试:从Spring Boot到分布式系统的技术探讨

场景一&#xff1a;电商平台的订单处理 面试官&#xff1a; “谢先生&#xff0c;假设我们在一个电商平台工作&#xff0c;你将如何使用Spring Boot构建一个订单处理服务&#xff1f;” 谢飞机&#xff1a; “这个简单&#xff0c;我会使用Spring Boot快速启动项目&#xff0…

【Redis】string 类型

string 一. string 类型介绍二. string 命令set、getmget、msetsetnx、setex、psetexincr、incrby、decr、decrby、incrbyfloatappend、getrange、setrange、strlen 三. string 命令小结四. string 内部编码方式五. string 的应用场景缓存功能计数功能共享会话手机验证码 六. 什…

HTTP/HTTPS与SOCKS5三大代理IP协议,如何选择最佳协议?

在复杂多变的网络环境中&#xff0c;代理协议的选择直接影响数据安全、访问效率和业务稳定性。HTTP、HTTPS和SOCKS5作为三大主流代理协议&#xff0c;各自针对不同场景提供独特的解决方案。本文将从协议特性、性能对比到选型策略&#xff0c;为您揭示如何根据业务需求精准匹配最…

【ArcGIS Pro微课1000例】0071:将无人机照片生成航线、轨迹点、坐标高程、方位角

文章目录 一、照片预览二、生成轨迹点三、照片信息四、查看方位角五、轨迹点连成线一、照片预览 数据位于配套实验数据包中的0071.rar,解压之后如下: 二、生成轨迹点 地理标记照片转点 (数据管理),用于根据存储在地理标记照片文件(.jpg 或 .tif)元数据中的 x、y 和 z 坐…

【C++项目】:仿 muduo 库 One-Thread-One-Loop 式并发服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 &#x1f525; 前言 一&#xff1a;&#x1f525; 项目储备知识 &#x1f98b; HTTP 服务器&#x1f98b; Reactor 模型&#x1f380; 单 Reactor 单线程&#xff1a;单I/O多路…

【java】aes,salt

AES&#xff08;高级加密标准&#xff09;是一种对称加密算法&#xff0c;广泛用于数据加密。在使用 AES 加密时&#xff0c;通常会结合盐值&#xff08;Salt&#xff09;来增强安全性。盐值是一个随机生成的值&#xff0c;用于防止彩虹表攻击和提高加密的复杂性。 一、AES 加…

路由器、网关和光猫三种设备有啥区别?

无论是家中Wi-Fi信号的覆盖&#xff0c;还是企业网络的高效运行&#xff0c;路由器、网关和光猫这些设备都扮演着不可或缺的角色。然而&#xff0c;对于大多数人来说&#xff0c;这三者的功能和区别却像一团迷雾&#xff0c;似懂非懂。你是否曾疑惑&#xff0c;为什么家里需要光…

机顶盒CM311-5s纯手机免拆刷机,全网通,当贝桌面

需要用到的工具 安卓手机一台 甲壳虫adb助手&#xff08;安卓app&#xff09; OTG转换线一个&#xff08;或者用usb&#xff0c;typec双头的U盘一个&#xff0c;未测试&#xff09; 8g U盘一个 用到的刷机文件 1.放入手机中的文件 misc recovery 2. 放入U盘根目录 upda…

c/c++类型别名定义

author: hjjdebug date: 2025年 05月 28日 星期三 12:54:25 CST descrip: c/c类型别名定义: 文章目录 1. #define 是宏替换.2. c风格的typedef 通用形式 typedef type_orig alias3. c风格的using 为类型定义别名的一般格式: using alias type_orig4. using 的优点: 可以直接使…

Virtuoso中对GDS文件进行工艺库转换的方法

如果要对相同工艺节点下进行性能评估&#xff0c;可以尝试将一个厂商的GDS文件转换到另一个厂商&#xff0c;不过要注意的是不同厂商&#xff08;比如SMIC和TSMC&#xff09;之间的DRC规则&#xff0c;尽量采用两个DRC中的约束较为紧张的厂商进行设计&#xff0c;以免转换到另外…

Kubernetes 中部署 kube-state-metrics 及 Prometheus 监控配置实战

文章目录 Kubernetes 中部署 kube-state-metrics 及 Prometheus 监控配置实战环境准备创建监控命名空间准备配置文件创建 ServiceAccount配置 RBAC 权限部署 kube-state-metrics部署node_exporter(可选)验证服务账号 TokenPrometheus 配置示例小结验证增加Grafana面板增加prome…

《重塑认知:Django MVT架构的多维剖析与实践》

MVT&#xff0c;即Model - View - Template&#xff0c;是Django框架独特的架构模式。它看似简单的三个字母&#xff0c;实则蕴含着深刻的设计哲学&#xff0c;如同古老智慧的密码&#xff0c;解开了Web应用开发的复杂谜题。 模型&#xff0c;是MVT架构中的数据核心&#xff0…

【JVM】初识JVM 从字节码文件到类的生命周期

初识JVM JVM&#xff08;Java Virtual Machine&#xff09;即 Java 虚拟机&#xff0c;是 Java 技术的核心组件之一。JVM的本质就是运行在计算机上的一个程序&#xff0c;通过软件模拟实现了一台抽象的计算机的功能。JVM是Java程序的运行环境&#xff0c;负责加载字节码文件&a…