import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.Serializable; import javax.imageio.ImageIO; /** * 图片验证码 * @author Administrator * */ public class ValidCode implements Serializable{ /** * 序列化ID */ private static final long serialVersionUID = -8725769201698918197L; private static int WIDTH = 80; private static int HEIGHT = 28; private byte[] imgBytes=null; private String validCode; public ValidCode() { } public void create()throws Exception{ char[] rands =generateCheckCode(); validCode =new String(rands); imgBytes = createValidCode(rands); } public byte[] getImgBytes() { return imgBytes; } public void setImgBytes(byte[] imgBytes) { this.imgBytes = imgBytes; } public String getValidCode() { return validCode; } public void setValidCode(String validCode) { this.validCode = validCode; } /*** * 创建验证码 * @return * @throws IOException */ private byte[] createValidCode( char[] rands ) throws IOException{ ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 创建内存图象 BufferedImage image =new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); // 产生图像 drawBackground(g); drawRands(g, rands); // 结束图像的绘制过程,完成图像 g.dispose(); // 将图像输出到客户端 ImageIO.write(image, "JPEG", bos); byte[] retBytes = bos.toByteArray(); bos.close(); return retBytes; } // 产生随机的认证码 private char[] generateCheckCode() { // 定义验证码的字符表 String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[] rands = new char[4]; for (int i = 0; i < 4; i++) { int rand = (int) (Math.random() * 36); rands[i] = chars.charAt(rand); } return rands; } private void drawRands(Graphics g, char[] rands) { g.setColor(Color.white); g.setFont(new Font(null, Font.ITALIC, 22)); // 在不同的高度上输出验证码的每个字符 g.drawString("" + rands[0], 6, 17); g.drawString("" + rands[1], 22, 22); g.drawString("" + rands[2], 43, 18); g.drawString("" + rands[3], 61, 24); } private void drawBackground(Graphics g) { // 画背景 g.setColor(new Color(0x68AF02)); g.fillRect(0, 0, WIDTH, HEIGHT); // 随机产生80个干扰点 for (int i = 0; i < 20; i++) { int x = (int) (Math.random() * WIDTH); int y = (int) (Math.random() * HEIGHT); int red = (int) (Math.random() * 255); int green = (int) (Math.random() * 255); int blue = (int) (Math.random() * 255); g.setColor(new Color(red, green, blue)); g.drawOval(x, y, 1, 0); } } /* public static void main(String[] args){ ValidCode validCode =new ValidCode(); try { validCode.create(); System.out.println(validCode.getValidCode()); System.out.println(validCode.getImgBytes().length); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } */ }
以下为输出到浏览器方法
ServletOutputStream sos = response.getOutputStream(); ValidCode validCode = new ValidCode(); validCode.create(); byte[] imageBytes = validCode.getImgBytes(); String strValidCode = validCode.getValidCode(); response.setContentLength(imageBytes.length); sos.write(imageBytes); sos.close();