实现发送器来真实的发送验证码

需要实现Poster接口来真实的发送验证码,可参考LoggerPoster实现。

如何生成验证码

需要实现CodeGenerator接口来生成验证码,SimpleCodeGenerator已经可以满足绝大多数的应用场景了。

如何生成验证码内容

需要实现ContentGenerator接口来生成验证码内容, 可参考SimpleContentGenerator实现。 通过访问Context可获取到足够多的环境信息,生成足够复杂的验证码。 其中Context.getCodeAttribute()是每次发送、验证验证码都需要传入的自定义属性。

如何生成缓存验证码发送历史的key

需要实现KeyGenerator。 通过KeyGenerator可以很容易的实现多类型多通道的验证码。

KeyGenerator generator = (recipient, context) -> {
  CodeAttribute attribute = context.getCodeAttribute();
  StringBuilder sb = new StringBuilder();
  sb.append(attribute.getCodeType())
    .append("_")
    .append(recipient)
    .append("_")
    .append(attribute.getAttribute("VERIFY_TYPE"));
  Long userId = (Long) attribute.getAttribute("USER_ID");
  if (userId != null) {
    sb.append("_user_id_").append(userId);
  }
  return sb.toString();
};

如何控制缓存的过期时间

需要实现CacheExpireCalculator接口来控制。 可参考SimpleCacheExpireCalculator实现,该实现会尽量控制发送历史在当日的最后时刻(23:59:59)过期, 但如果用户发送的验证码的有效期持续到第二天,那么该验证码发送历史的过期时间则持续到该验证码过期。 因此需要BanishPostHistoryPostFilter来驱逐那些前一天发送的验证码。

如何控制验证码的发送过程

需要实现PostFilter接口.

PostFilter的一些内置实现

  1. BanishPostHistoryPostFilter:主要是驱逐那些昨日发送的验证码,以确保后续的PostFilter能够正常工作。
  2. PostCountPostFilter:主要作用是控制验证码缓存在失效前的总发送数量。
  3. PostIntervalPostFilter:主要作用是控制每个验证码之间的发送间隔,确保用户无法频繁发送验证码。
  4. PostSubIntervalCountPostFilter:主要作用是在PostCountPostFilter的基础上,控制一定时间范围内的总验证码发送数量,如每天最多发送20条验证码且每小时最多发送5条验证码。