隨著移動互聯(lián)網(wǎng)的普及,短信驗證碼已經(jīng)成為了很多應用的常用登錄和注冊方式之一。在傳統(tǒng)的應用中,我們一般使用第三方集成商提供的短信驗證碼服務(wù)來實現(xiàn)短信驗證碼的發(fā)送和驗證,但是這些服務(wù)有可能存在時間限制、價格過高等限制。
為了解決這些問題,我們可以使用Spring Boot來自己實現(xiàn)短信驗證碼。在本文中,我將向大家介紹如何使用Spring Boot來實現(xiàn)短信驗證碼,并提供詳細的開發(fā)流程和代碼示例。
前置條件
在實現(xiàn)短信驗證碼之前,需要配置以下環(huán)境和依賴:
- JDK 1.8或以上版本
- Maven 3.5或以上版本
- Spring Boot 2.0或以上版本
- 阿里云短信服務(wù)
短信驗證碼的實現(xiàn)思路
在實現(xiàn)短信驗證碼之前,我們需要確定實現(xiàn)短信驗證碼需要哪些步驟:
- 客戶端向服務(wù)端發(fā)送手機號碼
- 服務(wù)端生成隨機的驗證碼并發(fā)送到該手機號碼
- 客戶端將驗證碼發(fā)送到服務(wù)端進行校驗
根據(jù)這個思路,我們可以通過以下幾個步驟來實現(xiàn)短信驗證碼:
- 在
application.properties
文件中配置阿里云短信服務(wù)的AccessKey和SecretKey:
# 阿里云短信服務(wù)的AccessKey
aliyun.sms.accessKeyId=your_accessKeyId
# 阿里云短信服務(wù)的SecretKey
aliyun.sms.accessKeySecret=your_accessKeySecret
- 定義短信驗證碼的請求和響應類:
public class SmsRequest {
// 手機號碼
private String phone;
// 驗證碼
private String code;
// 發(fā)送時間
private Long timestamp;
// 簽名
private String signature;
// getter和setter方法
}
public class SmsResponse {
// 發(fā)送狀態(tài)碼
private String code;
// 發(fā)送消息
private String message;
// getter和setter方法
}
- 定義短信發(fā)送接口:
public interface SmsService {
/**
* 發(fā)送短信驗證碼
*
* @param phone 手機號碼
* @return 發(fā)送狀態(tài)
*/
SmsResponse sendSms(String phone);
}
- 實現(xiàn)短信發(fā)送接口:
@Service
public class SmsServiceImpl implements SmsService {
// 阿里云短信服務(wù)的AccessKey
@Value("${aliyun.sms.accessKeyId}")
private String ACCESS_KEY_ID;
// 阿里云短信服務(wù)的SecretKey
@Value("${aliyun.sms.accessKeySecret}")
private String ACCESS_KEY_SECRET;
// 驗證碼的有效時間,單位為秒
private static final int EXPIRATION = 120;
/**
* 發(fā)送短信驗證碼
*
* @param phone 手機號碼
* @return 發(fā)送狀態(tài)
*/
@Override
public SmsResponse sendSms(String phone) {
SmsResponse response = new SmsResponse();
try {
DefaultProfile profile = DefaultProfile.getProfile("default", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
IAcsClient client = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
// 設(shè)置短信模板
request.setTemplateCode("SMS_123456789");
// 生成驗證碼
String code = String.valueOf((int)((Math.random()*9+1)*100000));
// 將驗證碼保存到Redis緩存中
jedis.setex(phone, EXPIRATION, code);
Map<String, String> map = new HashMap<>(1);
map.put("code", code);
// 設(shè)置短信參數(shù)
request.setTemplateParam(new Gson().toJson(map));
request.setPhoneNumbers(phone);
// 發(fā)送
SendSmsResponse smsResponse = client.getAcsResponse(request);
if (smsResponse.getCode() != null && smsResponse.getCode().equals("OK")) {
response.setCode("200");
response.setMessage("驗證碼發(fā)送成功");
} else {
response.setCode("500");
response.setMessage("驗證碼發(fā)送失敗,請稍后再試");
}
} catch (Exception e) {
response.setCode("500");
response.setMessage("驗證碼發(fā)送失敗,請稍后再試");
e.printStackTrace();
}
return response;
}
}
在上述示例代碼中,我們使用阿里云短信服務(wù)的SDK發(fā)送短信,首先從配置文件中獲取AccessKey和SecretKey,然后生成IAcsClient對象,并設(shè)置模板代碼,生成驗證碼并保存到Redis緩存中,最后發(fā)送短信。
- 創(chuàng)建接口Controller:
@RestController
@RequestMapping("/api/sms")
public class SmsController {
private final SmsService smsService;
public SmsController(SmsService smsService) {
this.smsService = smsService;
}
/**
* 發(fā)送短信驗證碼
* @param phone 手機號碼
* @return 發(fā)送狀態(tài)
*/
@GetMapping("/send")
public SmsResponse sendSms(@RequestParam("phone") String phone) {
return smsService.sendSms(phone);
}
}
在上面代碼中,我們創(chuàng)建了一個發(fā)送短信驗證碼的接口,并使用@GetMapping
注解將其映射到/api/sms/send
路徑上。
- 實現(xiàn)驗證碼校驗:
@RestController
@RequestMapping("/api/sms")
public class SmsController {
private final SmsService smsService;
public SmsController(SmsService smsService) {
this.smsService = smsService;
}
/**
* 發(fā)送短信驗證碼
* @param phone 手機號碼
* @return 發(fā)送狀態(tài)
*/
@GetMapping("/send")
public SmsResponse sendSms(@RequestParam("phone") String phone) {
return smsService.sendSms(phone);
}
/**
* 校驗驗證碼
* @param request 校驗請求
* @return 校驗結(jié)果
*/
@PostMapping("/verify")
public ResponseEntity<?> verifySms(@RequestBody SmsRequest request) {
String code = jedis.get(request.getPhone());
if (code != null && code.equals(request.getCode())) {
jedis.del(request.getPhone());
return ResponseEntity.ok("驗證碼校驗成功");
} else {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("驗證碼校驗失敗");
}
}
}
在上述代碼中,我們創(chuàng)建了一個校驗短信驗證碼的接口,并使用@PostMapping
注解將其映射到/api/sms/verify
路徑上。在接口實現(xiàn)中,我們從Redis緩存中獲取驗證碼,若驗證碼有效,則從Redis緩存中刪除驗證碼并返回成功響應,否則返回失敗響應。
- 使用Redis緩存:
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(host, port);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
@Bean
RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
return template;
}
}
在上述代碼中,我們創(chuàng)建了一個Redis配置類,并使用@Configuration
注解將其標注為配置類。在jedisConnectionFactory
方法中,我們設(shè)置了Redis服務(wù)器的IP和端口,并返回一個JedisConnectionFactory
對象,用于獲取Jedis實例。在redisTemplate
方法中,我們創(chuàng)建了一個RedisTemplate對象,并設(shè)置了序列化器和連接工廠。
至此,我們已經(jīng)完成了短信驗證碼的實現(xiàn)。
總結(jié)
Spring Boot為我們提供了快速便捷地實現(xiàn)短信驗證碼功能的方式。在本文中,我向大家展示了使用阿里云短信服務(wù)發(fā)送短信驗證碼并實現(xiàn)驗證碼校驗的代碼示例。如果您打算實現(xiàn)短信驗證碼功能,可以參考本文提供的思路和代碼示例。
在實際開發(fā)中,我們還可以根據(jù)業(yè)務(wù)需求對短信驗證碼進行更多的優(yōu)化和改進,比如添加驗證碼圖形識別、增加短信發(fā)送次數(shù)校驗、防止惡意發(fā)送、短信的批量發(fā)送等功能。文章來源:http://www.zghlxwxcb.cn/news/detail-465272.html
總之,短信驗證碼是現(xiàn)在很常見的一種驗證方式,其簡單、便捷、安全的特點獲得了很多企業(yè)和應用的青睞。希望本文可以對您實現(xiàn)短信驗證碼功能有所幫助。文章來源地址http://www.zghlxwxcb.cn/news/detail-465272.html
到了這里,關(guān)于讓你的Demo更安全--Spring Boot實現(xiàn)短信驗證碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!