在Java开发中,发送手机验证码时需要考虑以下几个问题:
- 验证码的有效期:验证码应该有一定的有效期,一般设置为几分钟或者十几分钟。过期的验证码应该被认为是无效的,不能用于验证用户身份。
- 手机号码格式的校验:应该对用户输入的手机号码进行格式校验,确保其符合手机号码的格式要求。例如,手机号码应该是11位数字,以1开头,不含其他字符。
- 验证码的重复使用:应该限制验证码的重复使用,即同一个验证码不能被多次使用。否则可能导致用户的账号被恶意攻击者盗用。
- 手机号码的安全性:应该注意保护用户的手机号码安全,不要将用户的手机号码保存在明文格式,避免泄露用户的个人信息。
- 验证码的加密传输:在发送验证码过程中,应该使用加密传输方式,避免验证码被拦截或者窃取。
- 发送短信的限制:应该限制发送短信的频率和数量,避免过度发送短信给用户,影响用户体验。
- 发送短信的成本:需要考虑发送短信的成本,避免浪费资源。可以通过采用短信通道和短信模板的方式降低短信发送的成本。
腾讯云的短信服务(满足需求5和7)
1.进入腾讯云,然后登录
2.腾讯云好像改布局了,不能直接在云产品那边搜索,需要进入自己的控制台,然后搜索短信
3.完成创建短信签名、创建短信正文模板和创建应用,每一项右边都会出现详细说明
可以使用标准模板
4.需要记住以下几组数据
-
签名管理的签名内容
-
正文模板中的id
-
左侧应用管理->应用列表的 SDKAppId
-
最重要的一步,CAM 密钥查询:链接
pom文件添加
<!--腾讯手机验证码-->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. -->
<!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询所有版本,最新版本如下 -->
<version>3.1.703</version>
</dependency>
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mp-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
配置redis的序列化规则(可读性)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
*
* @author: zpy
* @Description: rdeis序列化规则
* @date 2023/2/28
*/
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//创建一个json序列化对象
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置value的序列化方式json
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
//设置key序列化为String
redisTemplate.setKeySerializer(new StringRedisSerializer())