关于java 图形验证码的解决方法

Java教程 2025-08-19

复制代码代码如下:

package cn.response;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")

public class validatePicture extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

try {

validateimage(request, response);

} catch (Exception e) {

e.printStackTrace();

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

public static final int WIDTH = 120;

public static final int HEIGHT = 25;

public void validateimage(HttpServletRequest request,

HttpServletResponse response) throws Exception {

BufferedImage bi = new BufferedImage(WIDTH, HEIGHT,

BufferedImage.TYPE_INT_RGB);// 在内存中构建一幅图象

Graphics g = bi.getGraphics();

setBackGround(g);// 设置背景色

setBorder(g);// 设置边框

drawRandomLine(g);// 画干扰线

String random = drawRandomNum((Graphics2D) g);// 写随机数

request.getSession().setAttribute("random", random);

//request.getSession(false);

response.setContentType("image/jpeg");

// 设置不要缓存

response.setDateHeader("expries", -1);

response.setHeader("Cache-Control", "no-cache");

ImageIO.write(bi, "jpg", response.getOutputStream());

}

private String drawRandomNum(Graphics2D g) {

g.setColor(Color.RED);

g.setFont(new Font("宋体", Font.BOLD, 20));

// [/u4e00-/u9fa5]中文数字区间

String base = "/u4e00/u4f00/u5e00/u4e50/u4e89/u4f10/u4e09";

StringBuffer sb = new StringBuffer();

int x = 5;

for (int i = 0; i <  4; i++) {

int degree = new Random().nextInt() % 30;

String ch = base.charAt(new Random().nextInt(base.length())) + "";

sb.append(ch);

g.rotate(degree * Math.PI / 180, x, 20);

g.drawString(ch, x, 20);

g.rotate(-degree * Math.PI / 180, x, 20);

x = x + 30;

}

System.out.println(sb.toString());

return sb.toString();

}

private void drawRandomLine(Graphics g) {

g.setColor(Color.GREEN);

for (int i = 0; i <  3; i++) {

int x1 = new Random().nextInt(WIDTH);

int y1 = new Random().nextInt(HEIGHT);

int x2 = new Random().nextInt(WIDTH);

int y2 = new Random().nextInt(HEIGHT);

g.drawLine(x1, y1, x2, y2);

}

}

private void setBorder(Graphics g) {

g.setColor(Color.BLUE);

g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);

}

private void setBackGround(Graphics g) {

g.setColor(Color.WHITE);

g.fillRect(0, 0, WIDTH, HEIGHT);

}

}