github 验证码插件

引入依赖

1
compile group: 'com.github.cage', name: 'cage', version:'1.0'

逻辑处理

Captcha.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import com.github.cage.Cage;
import com.github.cage.GCage;
import com.github.cage.YCage;
import lombok.experimental.UtilityClass;
import net.jodah.expiringmap.ExpiringMap;
import org.apache.commons.lang3.RandomStringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

@UtilityClass
public final class Captcha {

  private static final Cage GCAGE = new GCage();//similar to google
  private static final Cage YCAGE = new YCage();//similar to yahoo

  private static final ExpiringMap<String, String> CACHE = ExpiringMap.builder()
      .expiration(1, TimeUnit.MINUTES).build();

  public static void generate(HttpServletResponse response) {
    String key = TUtil.uuid();
    response.setHeader("Access-Control-Expose-Headers", "Key");
    response.setHeader("Key", key);
    response.setHeader("Content-disposition", "inline");
    response.setContentType(MimeTypeUtils.IMAGE_JPEG_VALUE);
    String text = RandomStringUtils.randomAlphanumeric(4);
    try {
      GCAGE.draw(text, response.getOutputStream());
    } catch (IOException e) {
      e.printStackTrace();
      return;
    }
    CACHE.put(key, text);
  }

  public static boolean acquire(String key, String code) {
    String value = CACHE.get(key);
    if (value == null || !code.equalsIgnoreCase(value)) {
      return false;
    } else {
      CACHE.remove(key);
      return true;
    }
  }

}