验证码校验是日常中很常见的场景,工作中难免会遇到了生成和校验验证码这样的需求,下面我们就来用java实现它
验证码生成和校验我用到了Hutool工具类,我们先引入他的依赖
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-captchaartifactId>
<version>5.8.6version>
dependency>
hutool生成图片验证码的核心接口是ICaptcha
,此接口定义了以下方法:
createCode
创建验证码,实现类需同时生成随机验证码字符串和验证码图片getCode
获取验证码的文字内容verify
验证验证码是否正确,建议忽略大小写write
将验证码写出到目标流中而AbstractCaptcha
为一个ICaptcha
抽象实现类,此类实现了验证码文本生成、非大小写敏感的验证、写出到流和文件等方法,通过继承此抽象类只需实现createImage
方法定义图形生成规则即可。
创建一个Demo,将验证码生成到本地
public static void main(String[] args) {
// 定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
// 图形验证码写出到指定文件
lineCaptcha.write("F:/test/captcha.png");
}
此外,我们还可以将验证码通过Servlet输出到浏览器
@GetMapping
public void createCaptcha(HttpServletResponse response) throws IOException {
// 定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
// 图形验证码写出,可以写出到文件,也可以写出到流
lineCaptcha.write(response.getOutputStream());
// 关闭流
response.getOutputStream().close();
}
CaptchaUtil
还可以创建各种样式的验证码:
圆形干扰验证码:
// 定义图形验证码的长、宽、验证码字符数、干扰元素个数
CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 30);
扭曲干扰验证码:
// 定义图形验证码的长、宽、验证码字符数、干扰线宽度
ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
GIF验证码:
// 定义GIF验证码的长、宽
GifCaptcha captcha = CaptchaUtil.createGifCaptcha(200, 100);
校验我们会用到ICaptcha
的getCode()
方法和verify()
,生成图片验证码之后
public static void main(String[] args) {
// 定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
// 图形验证码写出到文件
lineCaptcha.write("F:/test/captcha.png");
// getCode()可以获取到验证码的值
System.out.println(lineCaptcha.getCode());
// verify()验证图形验证码的有效性,返回boolean值
System.out.println(lineCaptcha.verify("ABCD"));
System.out.println(lineCaptcha.verify(lineCaptcha.getCode()));
}
但是我一般不会用到verify()
方法,我的逻辑是生成验证码的时候通过getCode()
获取到他的code存入redis中,然后来校验
有时候普通的验证码不满足要求,比如我们希望使用纯数字、加减乘除的验证码,此时我们就可以自定义他的格式
纯数字的验证码:
@GetMapping
public void createCaptcha(HttpServletResponse response) throws IOException {
// 随机4位数字,可重复
RandomGenerator randomGenerator = new RandomGenerator("0123456789", 4);
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
lineCaptcha.setGenerator(randomGenerator);
// 重新生成code
lineCaptcha.createCode();
lineCaptcha.write(response.getOutputStream());
// 关闭流
response.getOutputStream().close();
}
四则运算验证码:
@GetMapping
public void createCaptcha(HttpServletResponse response) throws IOException {
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
// 自定义验证码内容为四则运算方式
lineCaptcha.setGenerator(new MathGenerator());
// 重新生成code
lineCaptcha.createCode();
// 重新生成code
lineCaptcha.createCode();
lineCaptcha.write(response.getOutputStream());
// 关闭流
response.getOutputStream().close();
}