import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Random; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; /** * 验证码生成 * @author hzp * */ @Results({ @Result( type="stream",params={"contentType","image/jpeg","inputName","inputStream"}) }) public class ValidateCodeAction extends ActionSupport{ private ByteArrayInputStream inputStream; // 设置备选验证码:包括"a-z"和数字"0-9" private static final String STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private static final int WIDTH = 120;// 验证码图片宽度 private static final int HEIGTH = 50;// 验证码图片高度 private static final int LENGTH = 4; // 设置默认生成4个验证码 private static final String SESSION_NAME = "validateCode";//sesion中的名字 public String execute() throws Exception{ BufferedImage image = new BufferedImage(WIDTH, HEIGTH,BufferedImage.TYPE_3BYTE_BGR); Graphics g = image.getGraphics(); Random random = new Random();// 创建一个随机类 g.setColor(getRandColor(200, 250));// 背景颜色要偏淡 g.fillRect(0, 0, WIDTH, HEIGTH);// 画背景 g.setColor(getRandColor(0, 255));// 边框颜色 g.drawRect(0, 0, WIDTH - 1, HEIGTH - 1);// 画边框 g.setColor(getRandColor(160, 200));// 随机产生5条干扰线,使图象中的认证码不易被其它程序探测到 for (int i = 0; i < 8; i++) { int x = random.nextInt(WIDTH); int y = random.nextInt(HEIGTH); int x1 = random.nextInt(WIDTH); int y1 = random.nextInt(HEIGTH); g.drawLine(x, y, x1, y1); } g.setColor(getRandColor(160, 200));// 随机产生100点,使图象中的认证码不易被其它程序探测到 for (int i = 0; i < 100; i++) { int x = random.nextInt(WIDTH); int y = random.nextInt(HEIGTH); g.drawLine(x, y, x, y); } Font font = new Font("Times New Roman", Font.ITALIC, 38); // 创建字体,字体的大小应该根据图片的高度来定。 g.setFont(font);// 设置字体 String sRand = ""; // 用随机产生的颜色将验证码绘制到图像中。 // 生成随机颜色(因为是做前景,所以偏深) // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); for (int i = 0; i < LENGTH; i++) { String ch = String.valueOf(STR.charAt(random.nextInt(STR.length()))); sRand += ch; g.drawString(ch, 22 * i + 12, (random.nextInt(5) - 2) * i + 40); } // 将生成的字符串存储在session中 ActionContext.getContext().getSession().put(SESSION_NAME, sRand); g.dispose();// 图像生效 ByteArrayOutputStream output = new ByteArrayOutputStream(); ImageOutputStream imageOut = ImageIO.createImageOutputStream(output); ImageIO.write(image, "JPEG", imageOut); imageOut.close(); ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray()); this.setInputStream(input); /*// 禁止图像缓存 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); // 创建二进制的输出流 ServletOutputStream sos = response.getOutputStream(); // 将图像输出到Servlet输出流中。 ImageIO.write(image, "jpeg", sos); sos.flush(); sos.close();*/ return SUCCESS; } /* * 给定范围获得随机颜色 */ public Color getRandColor(int lower, int upper) { Random random = new Random(); if (upper > 255) upper = 255; if (upper < 1) upper = 1; if (lower < 1) lower = 1; if (lower > 255) lower = 255; int r = lower + random.nextInt(upper - lower); int g = lower + random.nextInt(upper - lower); int b = lower + random.nextInt(upper - lower); return new Color(r, g, b); } public void setInputStream(ByteArrayInputStream inputStream) { this.inputStream = inputStream; } public ByteArrayInputStream getInputStream() { return inputStream; } }
验证码图片生成
猜你喜欢
转载自hzp.iteye.com/blog/1747675
今日推荐
周排行