先介绍一下Java生成验证码的基本流程:
- 随机生成字符或数字。
- 使用随机字体样式和大小。
- 创建画布,设置画布大小、背景色和边框。
- 在画布上绘制字符和干扰线等图形。
- 输出验证码图片。
下面我们来看一个完整的Java随机生成验证码的代码示例:
package com.example;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
public class VerifyCodeUtils {
// 验证码的字符集
private static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz";
private static Random random = new Random();
/**
* 获取随机生成的验证码图片
*/
public static void outputVerifyImage(HttpServletResponse response, int width, int height, int verifySize) {
int x = width / (verifySize + 1);
int y = height / 2;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, width, height);
graphics.setColor(Color.BLACK);
graphics.drawRect(0, 0, width - 1, height - 1);
Font font = new Font("Arial", Font.PLAIN, verifySize);
graphics.setFont(font);
for (int i = 0; i < 50; i++) {
int xs = random.nextInt(width);
int ys = random.nextInt(height);
int xe = xs + random.nextInt(width);
int ye = ys + random.nextInt(height);
graphics.setColor(getRandomColor());
graphics.drawLine(xs, ys, xe, ye);
}
StringBuilder verifyCode = new StringBuilder();
for (int i = 0; i < verifySize; i++) {
String code = String.valueOf(VERIFY_CODES.charAt(random.nextInt(VERIFY_CODES.length())));
verifyCode.append(code);
graphics.setColor(getRandomColor());
graphics.drawString(code, (i + 1) * x, y);
}
response.setContentType("image/jpeg");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
try (ServletOutputStream outputStream = response.getOutputStream()) {
ImageIO.write(image, "JPEG", outputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取随机颜色
*/
private static Color getRandomColor() {
int r = random.nextInt(255);
int g = random.nextInt(255);
int b = random.nextInt(255);
return new Color(r, g, b);
}
}
这段代码的作用是随机生成一个包含大小写字母和数字的验证码图片,支持自定义尺寸和样式。
我们来详细分析一下代码:
- 首先定义了一个常量
VERIFY_CODES
,表示验证码可选字符集合。 - 定义了一个生成随机数的
Random
对象random
。 - 定义了一个静态方法
outputVerifyImage
,该方法接收一个HttpServletResponse
参数和三个整型参数,分别表示图像的宽度、高度和验证码字符串长度。 - 根据绘制区域大小创建一个
BufferedImage
对象image
,并获取该对象的Graphics
上下文graphics
。 - 使用
graphics
对象设置画布的背景色和绘制边框。 - 使用
graphics
对象绘制干扰线。 - 使用
StringBuilder
对象生成随机的验证码字符串并绘制到画布上。 - 最后向客户端输出验证码图片。
- 定义了一个私有方法
getRandomColor
,返回一个随机颜色。
接下来我们再给出一个使用该工具类生成验证码图片的示例:
package com.example;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class VerifyCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
VerifyCodeUtils.outputVerifyImage(response, 120, 40, 4);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
这个示例是一个Servlet类,使用doGet
方法生成验证码图片,并将图片输出到HTTP响应中。
以上就是Java随机生成验证码的实例攻略,希望对您有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例 - Python技术站