概述

由来

由于对验证码需求量巨大,且我之前项目中有所积累,因此在Hutool中加入验证码生成和校验功能。

介绍

验证码功能位于cn.hutool.captcha包中,核心接口为ICaptcha,此接口定义了以下方法:

  • createCode 创建验证码,实现类需同时生成随机验证码字符串和验证码图片
  • getCode 获取验证码的文字内容
  • verify 验证验证码是否正确,建议忽略大小写
  • write 将验证码写出到目标流中

其中write方法只有一个OutputStreamICaptcha实现类可以根据这个方法封装写出到文件等方法。
AbstractCaptcha为一个ICaptcha抽象实现类,此类实现了验证码文本生成、非大小写敏感的验证、写出到流和文件等方法,通过继承此抽象类只需实现createImage方法定义图形生成规则即可。

实现类

LineCaptcha 线段干扰的验证码

生成效果大致如下: 验证码 - 图1
贴栗子:

  1. //定义图形验证码的长和宽
  2. LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
  3. //图形验证码写出,可以写出到文件,也可以写出到流
  4. lineCaptcha.write("d:/line.png");
  5. //输出code
  6. Console.log(lineCaptcha.getCode());
  7. //验证图形验证码的有效性,返回boolean值
  8. lineCaptcha.verify("1234");
  9. //重新生成验证码
  10. lineCaptcha.createCode();
  11. lineCaptcha.write("d:/line.png");
  12. //新的验证码
  13. Console.log(lineCaptcha.getCode());
  14. //验证图形验证码的有效性,返回boolean值
  15. lineCaptcha.verify("1234");

CircleCaptcha 圆圈干扰验证码

验证码 - 图2
贴栗子:

  1. //定义图形验证码的长、宽、验证码字符数、干扰元素个数
  2. CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
  3. //CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);
  4. //图形验证码写出,可以写出到文件,也可以写出到流
  5. captcha.write("d:/circle.png");
  6. //验证图形验证码的有效性,返回boolean值
  7. captcha.verify("1234");

ShearCaptcha 扭曲干扰验证码

验证码 - 图3
贴栗子:

  1. //定义图形验证码的长、宽、验证码字符数、干扰线宽度
  2. ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
  3. //ShearCaptcha captcha = new ShearCaptcha(200, 100, 4, 4);
  4. //图形验证码写出,可以写出到文件,也可以写出到流
  5. captcha.write("d:/shear.png");
  6. //验证图形验证码的有效性,返回boolean值
  7. captcha.verify("1234");

写出到浏览器(Servlet输出)

  1. ICaptcha captcha = ...;
  2. captcha.write(response.getOutputStream());
  3. //Servlet的OutputStream记得自行关闭哦!

自定义验证码

有时候标准的验证码不满足要求,比如我们希望使用纯字母的验证码、纯数字的验证码、加减乘除的验证码,此时我们就要自定义CodeGenerator

  1. // 自定义纯数字的验证码(随机4位数字,可重复)
  2. RandomGenerator randomGenerator = new RandomGenerator("0123456789", 4);
  3. LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
  4. captcha.setGenerator(randomGenerator);
  5. // 重新生成code
  6. captcha.createCode();
  1. ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 45, 4, 4);
  2. // 自定义验证码内容为四则运算方式
  3. captcha.setGenerator(new MathGenerator());
  4. // 重新生成code
  5. captcha.createCode();