import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.awt.*; import java.awt.image.*; import java.util.*; import javax.imageio.*; /** * @author wing.cai [email protected] * @version 1.0 * <br>Copyright (C), 2008-2009, wing.cai * <br>This program is protected by copyright laws. * <br>Program Name: * <br>Date: */ public class Img extends HttpServlet { private Font mFont = new Font("Arial Black",Font.PLAIN,16); public void init() throws ServletException { // Put your code here super.init(); } Color getRandColor(int fc,int bc){ Random random = new Random(); if (fc>255) fc=255; if (bc>255) bc=255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } private String getRandomChar(){ int rand = (int)Math.round(Math.random() * 2); long itmp = 0; char ctmp = '\u0000'; switch (rand){ //生成大写字母的情形 case 1: itmp = Math.round(Math.random() * 25 + 65); ctmp = (char)itmp; return String.valueOf(ctmp); //生成小写字母 case 2: itmp = Math.round(Math.random() * 25 + 97); ctmp = (char)itmp; return String.valueOf(ctmp); //生成数字 default: itmp = Math.round(Math.random() * 9); return String.valueOf(itmp); } } //生成服务器响应的service方法 @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub //阻止生成的页面内容被缓存,保证每次重新生成随机验证码 resp.setHeader("Pragma", "No-cache"); resp.setHeader("Cache-Control", "no-cache"); resp.setDateHeader("Expires", 0); resp.setContentType("image/jpeg"); //指定图形验证码图片的大小 int width = 100, height = 18; //生成一张新图片 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //在图片中绘制内容 Graphics g = image.getGraphics(); Random random = new Random(); g.setColor(getRandColor(200,250)); g.fillRect(1, 1, width-1, height-1); g.setColor(new Color(102,102,102)); g.drawRect(0, 0, width-1, height-1); g.setFont(mFont); //随机生成线条,让图片看起来更加杂乱 g.setColor(getRandColor(160,200)); for (int i = 0; i < 155; i++){ int x = random.nextInt(width - 1); int y = random.nextInt(height - 1); int x1 = random.nextInt(6) + 1; int y1 = random.nextInt(12) +1; g.drawLine(x, y, x + x1, y + y1); } //随机生成线条,让图片看起来更加杂乱 for (int i = 0; i < 70; i++){ int x = random.nextInt(width - 1); int y = random.nextInt(height - 1); int x1 = random.nextInt(12) + 1; int y1 = random.nextInt(6) + 1; g.drawRect(x, y, x + x1, y + y1); } //该变量用于保存系统生成的随即字符串 String sRand = ""; for (int i = 0; i < 6; i++){ //取得一个随机字符 String tmp = getRandomChar(); sRand += tmp; //将系统生成的随机字符添加到图形验证码图片上 g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110),20+random.nextInt(110))); g.drawString(tmp, 15 * i + 10, 15); } //取得用户Session HttpSession session = req.getSession(true); //将系统生成的图形验证码添加到用户Session中 session.setAttribute("rand", sRand); g.dispose(); //输出图形验证码图片 ImageIO.write(image, "JPEG", resp.getOutputStream()); } }