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中,就可以实现验证码的验证。
原文:http://www.cnblogs.com/sueny/p/5037215.html