Java 验证码工具类

时间:2022-10-15 15:18:59
package com.wuyu.util;

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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 验证码工具类
* @author wuyu
*/
public class ValidateCode {
public static final int WIDTH = 93;
public static final int HEIGHT = 30; public static String getImageCode(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 创建缓存
BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// 获得画布
Graphics g = bi.getGraphics();
// 设置背影色
setBackGround(g);
// 设置边框
setBorder(g);
// 写随机数
String random = drawRandomNum((Graphics2D) g);
// 将随机汉字存在session中
// request.getSession().setAttribute("checkcode", random);
// 将图形写给浏览器
response.setContentType("image/jpeg");
// 发头控制浏览器不要缓存
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// 将图片写给浏览器
ImageIO.write(bi, "jpg", response.getOutputStream());
return random;
} /**
* 设置背景色
*
* @param g
*/
private static void setBackGround(Graphics g) {
// 设置颜色
g.setColor(Color.WHITE);
// 填充区域
g.fillRect(0, 0, WIDTH, HEIGHT); } /**
* 设置边框
*
* @param g
*/
private static void setBorder(Graphics g) {
// 边框区域
g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
} /**
*
* @param g
* @return
*/
private static String drawRandomNum(Graphics2D g) {
StringBuffer sb = new StringBuffer();
// 设置颜色
g.setColor(Color.RED);
String[] code = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
"t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
int x = 7;
g.setFont(new Font("DEFAULT", Font.PLAIN, 24));
// 控制字符数
Random random = new Random();
for (int i = 0; i < 4; i++) {
// 设置字体旋转角度
int degree = new Random().nextInt() % 30;
// 截取\\
String ch = code[random.nextInt(code.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 += 20;
}
return sb.toString();
} }

  调用getImageCode方法后,返回一个字符串,然后放入session中,就可以实现验证码的验证。