验证码通常用于验证用户输入的正确性,防止机器人或恶意用户自动提交表单。在Java中,我们可以使用Java的图形库来生成验证码。以下是一个简单的Java验证码生成器的实现。

你需要一个用于生成随机字符的类,这里是一个简单的例子:
import java.util.Random;
public class RandomCharGenerator {
private static final String CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private Random random = new Random();
public char getRandomChar() {
return CHARS.charAt(random.nextInt(CHARS.length()));
}
}你可以创建一个验证码生成器类:
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.imageio.ImageWriter;
import javax.imageio.ImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.*;
import javax.*;
import javax.*;
import java.*;
import javax.*;
import javax.*;
import javax.*;
import javax.*;
import javax.*;
import javax.*;
import javax.*;
import javax.*;
import javax.*;
import javax.*;
import javax.*;
public class CaptchaGenerator {
private static final int WIDTH = 120;
private static final int HEIGHT = 40;
private static final int LINE_NO = 3;
private static final String FONT_NAME = "Arial";
private static final int FONT_SIZE = 24;
private static final int TYPE_SPEED = 3;
private static final int TYPE_SIZE = WIDTH / TYPE_SPEED ;
private static final char[] CHARS = {’A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’J’,’K’};
private Random randomGenerator = new Random();
private List<Integer> linePositions = new ArrayList<Integer>();
private Map<Character, Integer> charPositions = new HashMap<Character, Integer>();
private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
public CaptchaGenerator() {
Graphics g = image.getGraphics();
g .setColor(Color .white); g .fillRect(0 ,0 ,WIDTH ,HEIGHT); g .dispose();
for (int i=0 ; i <LINE_NO ; i++) { linePositions .add(randomGenerator .nextInt(WIDTH)); } for (int i=0 ; i <CHARS .length ; i++) { charPositions .put(CHARS [i], randomGenerator .nextInt(HEIGHT / FONT_SIZE)); } } public void generateCaptcha() { Graphics g = image .getGraphics(); g .setColor(Color .black); Font font = new Font(FONT_NAME , Font .BOLD , FONT_SIZE); g .setFont(font); String captchaText = ""; for (int i=0 ; i <TYPE_SIZE ; i++) { char captchaChar = CHARS [randomGenerator .nextInt(CHARS .length)]; captchaText += captchaChar ; int linePosition = linePositions .get(i); int charPosition = charPositions .get(captchaChar); drawCaptchaCharAt(g , captchaChar , linePosition , charPosition); } HttpSession session = request .getSession(); session .setAttribute("captcha", captchaText); } public void drawCaptchaCharAt(Graphics g , char character , int linePosition , int charPosition) { g .setColor(Color .black); g .drawString("" + character , linePosition , charPosition); } public void displayCaptchaImageToBrowser(HttpServletResponse response) throws ServletException , IOException { response .setContentType("image/jpeg"); OutputStream os = null ; try { os = response .getOutputStream(); ImageWriter writer = ImageIO .getImageWritersByFormatName("jpeg").next(); ImageOutputStream ios = writer .setOutput(os); writer .write(null , new IIOImage(image , null , null), new ImageWriteParam()); ios .close(); os .close(); } catch (Exception e) { e .printStackTrace(); } } } 捕获异常处理异常




