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中,就可以实现验证码的验证。