以下是Java实现简单验证码功能的攻略:
步骤一:生成验证码
- 导入相关类库。需要导入Java中的
BufferedImage
、Graphics
、Color
和Random
。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
- 定义画布大小和验证码长度。可以根据需要调整大小和长度,这里使用的是宽度200像素、高度50像素,长度为4个字符。
int width = 200;
int height = 50;
int length = 4;
- 创建
BufferedImage
对象。然后根据画布大小生成相同大小的图片。
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
- 获取绘图句柄。通过
Graphics
类设置验证码的一些参数,例如颜色、字体等。
Graphics g = image.getGraphics();
g.setColor(Color.WHITE); // 设置背景颜色
g.fillRect(0, 0, width, height);
g.setFont(new Font("Arial", Font.PLAIN, 30)); // 设置字体
- 生成随机验证码。这里使用了
Random
类生成4个10以内的随机数。
Random random = new Random();
String verifyCode = "";
for (int i = 0; i < length; i++) {
int value = random.nextInt(10); // 生成0~9的随机整数
verifyCode += value; // 将随机数添加到验证码末尾
}
- 绘制验证码。将验证码绘制在图片中。
g.drawString(verifyCode, 50, 40); // 在(50, 40)的位置绘制验证码
- 添加干扰线和点。可以增加验证码的安全性。这里使用直线和圆形的方式添加干扰线和点。
// 添加干扰线
for (int i = 0; i < 6; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.drawLine(x1, y1, x2, y2);
}
// 添加点
for (int i = 0; i < 50; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.fillOval(x, y, 2, 2);
}
- 结束绘制。释放资源。
g.dispose(); // 释放绘图资源
- 返回验证码。返回生成的验证码和图片。
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("verifyCode", verifyCode);
resultMap.put("image", image);
return resultMap;
步骤二:使用验证码
- 调用生成验证码的方法。获取到返回的验证码和图片。
Map<String, Object> resultMap = createVerifyCode(); // 调用生成验证码的方法
String verifyCode = resultMap.get("verifyCode").toString(); // 获取验证码
BufferedImage image = (BufferedImage) resultMap.get("image"); // 获取图片
- 在前端页面中显示验证码。将图片以Base64的形式嵌入HTML中。
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAIAAAB6T/buAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAKklEQVR42mP8/5+hGgAmVDWyLRCCVT6dpf8uAAAChJREFUeNpiYGBgEABACQQhtif8Xj5wAAAAASUVORK5CYII=" />
- 检查用户输入的验证码是否正确。获取用户提交的验证码,与生成的验证码进行比对。
if (userVerifyCode.equals(verifyCode)) {
// 验证码正确
} else {
// 验证码错误
}
示例说明
示例一:基础版验证码
下面是一个简单的示例,实现了一个基础的验证码生成功能。验证码的宽度为100像素,高度为30像素,长度为4个字符。每次请求生成的验证码均不同。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class VerifyCodeUtils {
public static Map<String, Object> createVerifyCode() {
int width = 100;
int height = 30;
int length = 4;
// 创建BufferedImage对象
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 设置背景颜色和字体
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
g.setFont(new Font("Arial", Font.BOLD, 20));
// 生成验证码
String verifyCode = "";
Random random = new Random();
for (int i = 0; i < length; i++) {
int value = random.nextInt(10);
verifyCode += value;
}
// 绘制验证码
g.setColor(Color.black);
g.drawString(verifyCode, 20, 22);
// 添加干扰线和点
for (int i = 0; i < 6; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.drawLine(x1, y1, x2, y2);
}
for (int i = 0; i < 50; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.fillOval(x, y, 2, 2);
}
// 释放资源
g.dispose();
// 返回结果
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("verifyCode", verifyCode);
resultMap.put("image", image);
return resultMap;
}
}
示例二:可配置化验证码
下面是另一个示例,实现了一个可配置化的验证码生成功能。可以根据需要配置验证码的大小、颜色、长度、字符集等参数,返回生成的验证码和图片。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
public class VerifyCodeUtils {
public static Map<String, Object> createVerifyCode(Map<String, Object> config) {
int width = Integer.valueOf(config.getOrDefault("width", "200").toString());
int height = Integer.valueOf(config.getOrDefault("height", "50").toString());
int length = Integer.valueOf(config.getOrDefault("length", "4").toString());
String charset = config.getOrDefault("charset", "0123456789").toString();
int lineWidth = Integer.valueOf(config.getOrDefault("line_width", "1").toString());
List<Color> colorList = new ArrayList<>();
colorList.add(new Color(91, 155, 213));
colorList.add(new Color(237, 125, 49));
colorList.add(new Color(165, 165, 165));
colorList.add(new Color(255, 192, 0));
// 创建BufferedImage对象
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 设置背景颜色和字体
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
g.setFont(new Font("Arial", Font.BOLD, 30));
// 生成验证码
String verifyCode = "";
Random random = new Random();
for (int i = 0; i < length; i++) {
int value = random.nextInt(charset.length());
verifyCode += charset.charAt(value);
}
// 绘制验证码
for (int i = 0; i < length; i++) {
g.setColor(colorList.get(random.nextInt(colorList.size())));
char c = verifyCode.charAt(i);
int x = (int) (width * 0.1) + (int) (width * 0.8) / length * i;
int y = (int) (height * 0.7);
g.drawString(String.valueOf(c), x, y);
}
// 添加干扰线和点
for (int i = 0; i < 6; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.drawLine(x1, y1, x2, y2);
}
for (int i = 0; i < 50; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.fillOval(x, y, 2, 2);
}
// 释放资源
g.dispose();
// 返回结果
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("verifyCode", verifyCode);
resultMap.put("image", image);
return resultMap;
}
}
这里的参数可以通过调用该方法时传入一个Map
类型的参数进行配置,例如:
Map<String, Object> config = new HashMap<>();
config.put("width", 200);
config.put("height", 40);
config.put("length", 5);
config.put("charset", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
config.put("line_width", 2);
Map<String, Object> resultMap = VerifyCodeUtils.createVerifyCode(config);
String verifyCode = resultMap.get("verifyCode").toString();
BufferedImage image = (BufferedImage) resultMap.get("image");
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现简单的验证码功能 - Python技术站