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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84930.shtml
英文地址,請注明出處:http://en.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…