图形验证码 -captcha
# 图形验证码 -captcha
# 1. 由来
在很多应用场景中,验证码是必不可少的安全防护措施。为此,Hutool 提供了一个轻量级且功能丰富的验证码生成和校验工具,简化了验证码的生成、验证和输出操作。
# 2. 介绍
验证码功能位于 cn.hutool.captcha
包中,核心接口为 ICaptcha
。该接口定义了以下常用方法:
createCode()
:创建验证码,实现类需同时生成随机验证码字符串和验证码图片。getCode()
:获取验证码的文字内容。verify(String inputCode)
:验证验证码是否正确,建议忽略大小写。write(OutputStream out)
:将验证码图片写出到目标流中。
其中,write()
方法可以将验证码图片输出到文件、响应流等。
AbstractCaptcha
是一个 ICaptcha
的抽象实现类,该类实现了验证码文本生成、非大小写敏感的验证、写出到流和文件等方法。通过继承此抽象类,只需实现 createImage()
方法来定义图形生成规则即可。
# 3. 实现类
# 3.1 线段干扰验证码 (LineCaptcha)
生成的效果如下:
代码示例:
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.lang.Console;
public class CaptchaExample {
public static void main(String[] args) {
// 定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
// 图形验证码写出,可以写出到文件,也可以写出到流
lineCaptcha.write("d:/line.png");
// 输出生成的验证码内容
Console.log("验证码内容: {}", lineCaptcha.getCode());
// 验证图形验证码的有效性,返回 boolean 值
boolean isValid = lineCaptcha.verify("1234");
Console.log("验证码是否有效: {}", isValid);
// 重新生成验证码
lineCaptcha.createCode();
lineCaptcha.write("d:/line.png");
Console.log("新的验证码内容: {}", lineCaptcha.getCode());
}
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 3.2 圆圈干扰验证码 (CircleCaptcha)
生成的效果如下:
代码示例:
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.CircleCaptcha;
public class CircleCaptchaExample {
public static void main(String[] args) {
// 定义图形验证码的长、宽、验证码字符数、干扰元素个数
CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
// 图形验证码写出,可以写出到文件,也可以写出到流
captcha.write("d:/circle.png");
// 验证图形验证码的有效性,返回 boolean 值
boolean isValid = captcha.verify("1234");
System.out.println("验证码是否有效: " + isValid);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 3.3 扭曲干扰验证码 (ShearCaptcha)
生成的效果如下:
代码示例:
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
public class ShearCaptchaExample {
public static void main(String[] args) {
// 定义图形验证码的长、宽、验证码字符数、干扰线宽度
ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
// 图形验证码写出,可以写出到文件,也可以写出到流
captcha.write("d:/shear.png");
// 验证图形验证码的有效性,返回 boolean 值
boolean isValid = captcha.verify("1234");
System.out.println("验证码是否有效: " + isValid);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 4. 写出到浏览器(Servlet 输出)
将验证码写出到浏览器响应流中:
import cn.hutool.captcha.ICaptcha;
import cn.hutool.captcha.CaptchaUtil;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CaptchaServlet {
public void doGet(HttpServletResponse response) throws IOException {
ICaptcha captcha = CaptchaUtil.createLineCaptcha(200, 100);
captcha.write(response.getOutputStream());
// Servlet 的 OutputStream 需要手动关闭
response.getOutputStream().close();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 5. 自定义验证码
有时标准的验证码不满足需求,例如生成纯数字验证码、数学运算验证码等,此时可以自定义 CodeGenerator
。
代码示例:
import cn.hutool.captcha.generator.MathGenerator;
import cn.hutool.captcha.generator.RandomGenerator;
import cn.hutool.captcha.LineCaptcha;
public class CustomCaptchaExample {
public static void main(String[] args) {
// 自定义纯数字的验证码(随机 4 位数字,可重复)
RandomGenerator randomGenerator = new RandomGenerator("0123456789", 4);
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
lineCaptcha.setGenerator(randomGenerator);
// 重新生成验证码
lineCaptcha.createCode();
System.out.println("数字验证码: " + lineCaptcha.getCode());
// 自定义验证码内容为四则运算方式
lineCaptcha.setGenerator(new MathGenerator());
lineCaptcha.createCode();
System.out.println("数学运算验证码: " + lineCaptcha.getCode());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 6. 实际开发场景
- 登录页面防刷:在用户登录页面中,加入验证码验证,有效防止暴力破解。
- 注册页面验证:用户注册时,使用验证码确保用户输入正确,减少恶意注册。
- 表单提交:在一些敏感表单提交时,加入验证码验证,确保数据的安全性。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08