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

SpringBoot整合阿里云短信业务

详细介绍SpringBoot整合阿里云短信服务的每一步过程,同时会将验证码存放到Redis中并设置过期时间,尽量保证实战的同时也让没做过的好兄弟也能实现发短信的功能~

1. 注册阿里云账号和创建Access Key

        首先,你需要注册一个阿里云账号(如果还没有),然后在控制台中创建Access Key。这个Access Key将用于通过API调用阿里云短信服务。在控制台中创建Access Key非常简单,只需遵循阿里云的步骤即可。

2. 添加相关的依赖

     在Spring Boot项目中,你需要添加阿里云短信服务、Redis的依赖、还有mybatis-plus

,这里直接用mybatis-plus了,非常的方便,省去了大量的DOM操作,你可以在pom.xml文件中添加以下依赖:

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>3.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

3. 配置阿里云短信服务、Redis参数

application.yml:

# 服务器配置
server:# 设置服务器端口port: 8080# 配置Servlet的上下文路径servlet:context-path: /api# 数据源配置,用于连接MySQL数据库
spring:datasource:# 数据库驱动类名driver-class-name: com.mysql.cj.jdbc.Driver# 数据库连接URLurl: jdbc:mysql://localhost:3306/×××# 数据库用户名username: ×××# 数据库密码password:×××# Redis配置redis:# Redis服务器地址host: ×××# Redis服务器端口port: ×××# Redis数据库索引database: ×××# MyBatis-Plus配置
mybatis-plus:# 全局配置global-config:# 数据库配置db-config:# 表名前缀table-prefix: ×××# 主键类型,自动根据数据库生成id-type: auto# 映射器位置,指定mapper接口的XML文件位置mapper-locations: classpath*:mapper/*.xml# MyBatis配置configuration:# 日志实现类,使用控制台输出日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

 配置Redis:

 

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){RedisTemplate<String, Object> template = new RedisTemplate<>();StringRedisSerializer redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);template.setConnectionFactory(factory);// key序列化template.setKeySerializer(redisSerializer);// value序列化template.setValueSerializer(jackson2JsonRedisSerializer);// value hashmap序列化 filed valuetemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(redisSerializer);return template;}
}

4. 创建工具类MsgController

阿里云短信服务Utils: 

public class SendMsgUtil {/*** 使用AK&SK初始化账号Client* @return Client* @throws Exception*/public static Client createClient() throws Exception {com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。.setAccessKeyId("xxxxxxxxxx")// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。.setAccessKeySecret("xxxxxxxx");config.endpoint = "dysmsapi.aliyuncs.com";return new Client(config);}/*** API 相关* @return OpenApi.Params*/public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params().setAction("SendSms").setVersion("2017-05-25").setProtocol("HTTPS").setMethod("POST").setAuthType("AK").setStyle("RPC").setPathname("/").setReqBodyType("json").setBodyType("json");return params;}public static String sendCode(String phone) throws Exception {Client client = createClient();com.aliyun.teaopenapi.models.Params params = createApiInfo();java.util.Map<String, Object> queries = new java.util.HashMap<>();queries.put("PhoneNumbers", xxxx);queries.put("SignName", "xxxx");queries.put("TemplateCode", "xxxxx"); //您正在申请手机注册,验证码为:${code},5分钟内有效!String code = generateVerificationCode();queries.put("TemplateParam", "{\"code\":\"" + code + "\"}");com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest().setQuery(com.aliyun.openapiutil.Client.query(queries));client.callApi(params, request, runtime);return code;}// 生成六位数的验证码public static String generateVerificationCode() {Random random = new Random();int firstDigit = random.nextInt(9) + 1;StringBuilder sb = new StringBuilder().append(firstDigit);for (int i = 0; i < 5; i++) {sb.append(random.nextInt(10));}return sb.toString();}}

像service层和mapper层以及entity层 都可以直接用mybatis-plus生成:

5. 短信验证码实现登录注册

接下来直接测试,我是在idea里使用插件Apipost进行测试的,也非常的好用:

点击发送后,输入的手机号就会收到一个验证码来进行验证:

然后,点击登陆测试:

结果:

还有一个注册功能,大概流程跟这一样,只不过会判断手机号是不是被注册过,接下来跟大家聊聊为什么要把验证码存储在redis当中:

将验证码保存到 Redis 中的优势在于其高性能、分布式特性、易设置过期时间、减少数据库负担和提升安全性。Redis 提供快速读写和自动过期管理,确保高效响应和验证码的及时失效,从而提高系统整体性能和安全性。

http://www.lryc.cn/news/409210.html

相关文章:

  • Kubernetes安全--securityContext介绍
  • 【React】通过实际示例详解评论列表渲染和删除
  • React 中 useState 语法详解
  • (面试必看!)一些和多线程相关的面试考点
  • 从零到一使用 Ollama、Dify 和 Docker 构建 Llama 3.1 模型服务
  • 【React】详解 React Router
  • 微软蓝屏”事件暴露了网络安全哪些问题?
  • upload-labs靶场练习
  • java使用hutool工具判断ip或者域名是否可用,java使用ping判断ip或者域名是否可用
  • apache2和httpd web服务器
  • 基于多种机器学习的豆瓣电影评分预测与多维度可视化【可加系统】
  • Linux系统配置STM32的开发环境(代码编辑,编译,下载调试)
  • 每日一题——第三十五题
  • Echarts 柱状图实现同时显示百分比+原始值+汇总值
  • 嵌入式学习Day13---C语言提升
  • Mysql随记
  • wire和reg的区别
  • c语言第四天笔记
  • Hive——UDF函数:高德地图API逆地理编码,实现离线解析经纬度转换省市区(离线地址库,非调用高德API)
  • 深入解析PHP框架:Symfony框架的魅力与优势
  • Go语言实战:基于Go1.19的站点模板爬虫技术解析与应用
  • 5个ArcGIS图源分享
  • 科普文:万字梳理31个Kafka问题
  • Unity UGUI 实战学习笔记(4)
  • Python学习和面试中的常见问题及答案
  • Mysql-索引视图
  • 电子签章-开放签应用
  • Ubuntu下设置文件和文件夹用户组和权限
  • JavaSE从零开始到精通(九) - 双列集合
  • 探索 OpenAI GPT-4o Mini:开发者的高效创新工具