有关SpringBoot验证码校验的一种思路
有关SpringBoot验证码校验的一种思路
思路很简单:就是将随机生成的验证码correctCode加密后的密文hash和时间tamp放入map中一并返回给前端,校验时,前端再传回的map和用户输入的验证码inputCode,再将inputCode进行同样的加密与传回的map中的hash进行对比,相同则验证码输入正确,否则输入错误,如此也能设置tamp保证一定的时效性。
上代码:
private static final String KEY = "XXXX"; // KEY为自定义秘钥
原文采用依赖Google的guava包中的MD5加密,我比较懒,不想导入依赖,直接用Spring框架中继承的DigestUtils工具类进行加密。
加密:
String code = VerifyCode(6); //随机数生成6位验证码
sendEmail(code); //发送验证码
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
Calendar c = Calendar.getInstance();
c.add(Calendar.MINUTE, 5);
String currentTime = sf.format(c.getTime());// 生成5分钟后时间,用户校验是否过期
String hash = DigestUtils.md5DigestAsHex((KEY + "@" + currentTime + "@" + code).getBytes());//生成MD5值
Map<String, Object> resultMap = new HashMap<>(); //返回的map
resultMap.put("hash", hash);
resultMap.put("tamp", currentTime);
return resultMap;
校验:
public String VerifyCode(@RequestBody Map<String,Object> requestMap, @PathVariable("verification") String code){
String requestHash = requestMap.get("hash").toString();
String tamp = requestMap.get("tamp").toString();
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");//当前时间
Calendar c = Calendar.getInstance();
String currentTime = sf.format(c.getTime());
if (tamp.compareTo(currentTime) > 0) {
String hash = DigestUtils.md5DigestAsHex((KEY + "@" + tamp + "@" + code).getBytes());//生成MD5值
if (hash.equalsIgnoreCase(requestHash)){
//校验成功
return "success";
}else {
//验证码不正确,校验失败
return "failed";
}
} else {
// 超时
return "failed";
}
}
验证码生成比较简单,只是通过随机数生成n位数字。
生成验证码:
//生成n位验证码
private String VerifyCode(int n){
Random r = new Random();
StringBuffer sb =new StringBuffer();
for(int i = 0;i < n;i ++){
int ran1 = r.nextInt(10);
sb.append(String.valueOf(ran1));
}
// System.out.println(sb);
return sb.toString();
}

浙公网安备 33010602011771号