有关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();
    }
注:思路参考自参考文章(作者:喝酒不骑马 Colton_Null) from CSDN
posted @ 2020-06-04 17:00  _Spike  阅读(409)  评论(0)    收藏  举报