下面是关于“Java 验证码的生成实现”的完整攻略。
在 Java 中,一般可以采用以下两种方式来生成验证码:
第三方库使用比较方便,而且功能比较完善,但不可避免地会增加项目的依赖。自己编写则可以自由定制,但需要自己写代码,处理各种问题。
因此,我们需要在考虑项目的实际需求和自身技术能力之间做出选择。
下面以使用第三方库的方式来生成验证码为例,向大家介绍生成验证码的具体实现。
在 Java 中,可以使用 Kaptcha 库来生成验证码。Kaptcha 是一个轻量级的验证码库,生成的验证码具有多种样式和特效。
要使用 Kaptcha 库,首先需要在项目中引入其相关依赖。可以在 Maven 的 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
引入依赖后,我们需要配置 Kaptcha 这个库,以及生成验证码的相关参数。代码示例如下:
// 配置 Kaptcha 库
Properties properties = new Properties();
properties.setProperty("kaptcha.border", "no");
properties.setProperty("kaptcha.textproducer.font.color", "black");
properties.setProperty("kaptcha.textproducer.char.space", "5");
Config config = new Config(properties);
// 生成验证码
DefaultKaptcha kaptcha = new DefaultKaptcha();
kaptcha.setConfig(config);
String code = kaptcha.createText();
byte[] imageData = kaptcha.createImage(code);
以上代码中,我们首先配置了 Kaptcha 库的相关参数,包括边框、字体颜色、字符间隔等。然后,我们生成了一个 DefaultKaptcha
对象,并将前面配置的参数设置进去。接着,我们生成了验证码文本 code
,并使用 kaptcha.createImage(code)
生成验证码图片。最终返回的 imageData
就是生成的验证码图片的字节数组。
生成了验证码图片后,我们需要将其显示到页面上,供用户输入。这里以使用 Spring Boot 框架为例,向大家介绍如何将验证码图片显示到页面上。
首先,我们需要在控制器中添加一个处理请求的方法,返回生成的验证码图片的字节数组:
@GetMapping("/captcha")
public void getCaptcha(HttpServletResponse response) throws IOException {
// 生成验证码
Properties properties = new Properties();
properties.setProperty("kaptcha.border", "no");
Config config = new Config(properties);
DefaultKaptcha kaptcha = new DefaultKaptcha();
kaptcha.setConfig(config);
String code = kaptcha.createText();
byte[] imageData = kaptcha.createImage(code);
// 将验证码图片发送到浏览器
response.setContentType("image/jpeg");
response.getOutputStream().write(imageData);
response.flushBuffer();
}
此时,访问 /captcha
路径,就可以得到生成的验证码图片了。
然后,在前端代码中,我们可以使用以下方式来显示验证码图片:
<img id="captchaImg" src="/captcha?rand=${Math.random()}">
这里使用了一个随机数来避免浏览器缓存缓存过的验证码图片。
如果想要自己编写生成验证码的代码,也是可以的。在这里,我们主要介绍如何使用 Java 的 java.awt
和 javax.imageio
包来实现验证码的生成。
该代码示例中,我们将生成一个随机 6 位数字的验证码,并将其绘制到一张图片中。关键代码如下:
BufferedImage image = new BufferedImage(96, 32, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) image.getGraphics();
g.setColor(new Color(255, 255, 255));
g.fillRect(0, 0, 96, 32);
g.setColor(new Color(0, 0, 0));
g.setFont(new Font("Arial", Font.BOLD, 22));
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 6; i++) {
int num = random.nextInt(10);
sb.append(num);
g.drawString(String.valueOf(num), (i * 16 + 8), 24);
}
g.dispose();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
byte[] imageData = baos.toByteArray();
在以上代码中,我们创建了一张 96x32 的空白图片,并将其填充为白色。然后,我们设置字体为 Arial 22 号加粗字体,并且使用循环随机生成 6 个数字,并在图片中绘制这些数字。最后,我们将生成的图片转换为字节数组。
如果需要将验证码显示到页面上,可以像前面的示例那样,将字节数组转换为图片流,在前端显示。例如:
<img id="captchaImg" src="data:image/png;base64,${imageData.toString('base64')}">
本文链接:http://task.lmcjl.com/news/7922.html