本篇内容涉及:
1、Redis存储验证码
2、阿里云短信服务
3、Attention:这个应用场景应该算是最最最普通的一种Redis的应用了。
我写的代码放在了:https://github.com/Crecendow/Sms-redis-SpringBoot
用一句话简述这个功能就是,UUID自动生成并且按照 key(电话号码)、value(验证码)的方式存在了redis中,redis会设置过期时间,每次发送验证码之前,会调用OpsForValue的get方法查看这条数据是否在redis存在,不在的话就自动生成一个验证码并发送给用户,同时存入redis当中,再次设置过期时间。
其中 发送短信的实现类是这样写的。
这块呢就是阿里云上面的写法,进入到阿里云的短信服务就自然而然的能看到的。
@Service
public class SendSmsImpl implements SendSms {
@Override
public boolean send(String phoneNumber, String templateCode, HashMap<String, Object> code) {
// 连接阿里云
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4Fy39w2k1Da2atVpew3z", "MYTMd0rPLVy3OsJsfo5FmvAMpQrGGt");
IAcsClient client = new DefaultAcsClient(profile);
//构建请求
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com"); //不要动
request.setSysVersion("2017-05-25"); //不要动
request.setSysAction("SendSms");
//自定义的参数(手机号、验证码、签名、模板)
request.putQueryParameter("PhoneNumbers", phoneNumber);
request.putQueryParameter("SignName", "阿辉说");
request.putQueryParameter("TemplateCode", templateCode);
//构建一个短信的验证码
String codeStr = JSONObject.toJSONString(code);
request.putQueryParameter("TemplateParam", codeStr);
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
return response.getHttpResponse().isSuccess();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
而最重要的Redis的部分我是这样写的。
@RestController
@CrossOrigin //跨域的支持
public class SmsApiController {
@Autowired
private SendSms sendSms;
@Autowired
private RedisTemplate<String,String> redisTemplate;
@GetMapping("/send/{phone}")
public String code(@PathVariable("phone")String phone){
//调用方法发送(模拟真实业务)
String code= redisTemplate.opsForValue().get(phone);
if(!StringUtils.isEmpty(code)){
return phone + ":" + code + "已存在,还没有过期";
}
//生成验证码并存储到redis中
code = UUID.randomUUID().toString().substring(0, 4);
HashMap<String, Object> param = new HashMap<>();
param.put("code", code);
boolean isSend = sendSms.send(phone, "SMS_194060228", param);
if(isSend){
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return phone + ":" + code + "发送成功";
}else{
return "发送失败";
}
}
}
连接Redis采用的是Spring-data-redis,连接设置写在了配置文件上了。
spring.redis.host=127.0.0.1
spring.redis.port=6379
总结:redis单机,没做集群,Spring-data-redis没做过多配置文件的设置,是一个非常简单的redis做缓存的一个应用了。