Class MemoryCodeCache

java.lang.Object
tech.riemann.nif.web.captcha.MemoryCodeCache
All Implemented Interfaces:
CodeCache

public class MemoryCodeCache extends Object implements CodeCache
内存验证码缓存(生产实现,H6 新增)

基于 ConcurrentHashMap,特点:

  • 过期清理:验证码默认 5 分钟过期(DEFAULT_TTL_MILLIS), set/get 时惰性清理过期条目,防止验证码 key 无限累积(内存泄漏)
  • 原子消费:覆写 consume(String, String) 使用 ConcurrentHashMap.remove(key, value) (仅当映射为该值时删除),并发下只有一个请求能消费成功,天然防重放
  • null 值处理:set(key, null) 视为删除(与测试既有语义一致)

适用于单机部署;分布式场景请实现 CodeCache 接入 Redis 等,并覆写 consume(String, String) 为原子操作。

Author:
Kerbores(kerbores@riemann.tech)
  • Constructor Details

    • MemoryCodeCache

      public MemoryCodeCache()
    • MemoryCodeCache

      public MemoryCodeCache(long ttlMillis)
  • Method Details

    • set

      public void set(String key, String value)
      Description copied from interface: CodeCache
      存储验证码

      将验证码与指定的键值关联并存储

      Specified by:
      set in interface CodeCache
      Parameters:
      key - 验证码的键值,用于后续获取验证码
      value - 验证码的值
    • get

      public String get(String key)
      Description copied from interface: CodeCache
      获取验证码

      根据键值获取存储的验证码

      Specified by:
      get in interface CodeCache
      Parameters:
      key - 验证码的键值
      Returns:
      存储的验证码值,如果不存在返回null
    • remove

      public void remove(String key)
      Description copied from interface: CodeCache
      删除验证码

      根据键值删除存储的验证码(H6 新增原语,供 CodeCache.consume(String, String) 默认实现与缓存清理使用)

      默认空实现用于兼容只实现了 set/get 的旧实现;需要真正删除语义的实现(如 MemoryCodeCache、Redis)应覆写

      Specified by:
      remove in interface CodeCache
      Parameters:
      key - 验证码的键值
    • consume

      public boolean consume(String key, String value)
      校验并消费验证码(原子操作,防重放)

      使用 ConcurrentHashMap.remove(key, value):仅当当前映射为该值时删除—— 并发请求中只有一个能消费成功,其余返回 false,验证码一次性生效。

      Specified by:
      consume in interface CodeCache
      Parameters:
      key - 验证码的键值
      value - 待校验的验证码值
      Returns:
      true 表示校验通过且已消费(删除),false 表示不匹配或不存在