servlet生成随机验证码

  1 package com.cgyue;
  2 
  3 import java.awt.Color;  
  4 import java.awt.Font;  
  5 import java.awt.Graphics;  
  6 import java.awt.image.BufferedImage;  
  7 import java.io.IOException;  
  8 import java.util.Random;  
  9  
 10 import javax.imageio.ImageIO;  
 11 import javax.servlet.ServletException;  
 12 import javax.servlet.http.HttpServlet;  
 13 import javax.servlet.http.HttpServletRequest;  
 14 import javax.servlet.http.HttpServletResponse;  
 15  
 16 /**  
 17  * 生成图形验证码的Servlet  
 18  */
 19 public class ImageCodeMakerServlet extends HttpServlet {  
 20  
 21     public void doGet(HttpServletRequest request, HttpServletResponse response)  
 22             throws ServletException, IOException {  
 23         doPost(request, response);  
 24     }  
 25  
 26     /**  
 27      * @see javax.servlet.http.HttpServlet#void  
 28      *      (javax.servlet.http.HttpServletRequest,  
 29      *      javax.servlet.http.HttpServletResponse)  
 30      */
 31     public void doPost(HttpServletRequest request, HttpServletResponse response)  
 32             throws ServletException, IOException {  
 33         // 首先设置页面不缓存  
 34         response.setHeader("Pragma", "No-cache");  
 35         response.setHeader("Cache-Control", "no-cache");  
 36         response.setDateHeader("Expires", 0);  
 37  
 38         // 定义图片的宽度和高度  
 39         int width = 90, height = 40;  
 40         // 创建一个图像对象  
 41         BufferedImage image = new BufferedImage(width, height,  
 42                 BufferedImage.TYPE_INT_RGB);  
 43         // 得到图像的环境对象  
 44         Graphics g = image.createGraphics();  
 45  
 46         Random random = new Random();  
 47         // 用随机颜色填充图像背景  
 48         g.setColor(getRandColor(180, 250));  
 49         g.fillRect(0, 0, width, height);  
 50         for (int i = 0; i < 5; i++) {  
 51             g.setColor(getRandColor(50, 100));  
 52             int x = random.nextInt(width);  
 53             int y = random.nextInt(height);  
 54             g.drawOval(x, y, 4, 4);  
 55         }  
 56         // 设置字体,下面准备画随机数  
 57         g.setFont(new Font("", Font.PLAIN, 40));  
 58         // 随机数字符串  
 59         String sRand = "";  
 60         for (int i = 0; i < 4; i++) {  
 61             // 生成四个数字字符  
 62             String rand = String.valueOf(random.nextInt(10));  
 63             sRand += rand;  
 64             // 生成随机颜色  
 65             g.setColor(new Color(20 + random.nextInt(80), 20 + random  
 66                     .nextInt(100), 20 + random.nextInt(90)));  
 67             // 将随机数字画在图像上  
 68             g.drawString(rand, (17 + random.nextInt(3)) * i + 8, 34);  
 69  
 70             // 生成干扰线  
 71             for (int k = 0; k < 12; k++) {  
 72                 int x = random.nextInt(width);  
 73                 int y = random.nextInt(height);  
 74                 int xl = random.nextInt(9);  
 75                 int yl = random.nextInt(9);  
 76                 g.drawLine(x, y, x + xl, y + yl);  
 77             }  
 78         }  
 79  
 80         // 将生成的随机数字字符串写入Session  
 81         request.getSession().setAttribute("randcode", sRand);  
 82         // 使图像生效  
 83         g.dispose();  
 84         // 输出图像到页面  
 85         ImageIO.write(image, "JPEG", response.getOutputStream());  
 86     }  
 87  
 88     /**  
 89      * 产生一个随机的颜色  
 90      * @param fc    颜色分量最小值  
 91      * @param bc    颜色分量最大值  
 92      * @return  
 93      */
 94     public Color getRandColor(int fc, int bc) {  
 95         Random random = new Random();  
 96         if (fc > 255){  
 97             fc = 255;  
 98         }  
 99         if (bc > 255){  
100             bc = 255;  
101         }  
102         int r = fc + random.nextInt(bc - fc);  
103         int g = fc + random.nextInt(bc - fc);  
104         int b = fc + random.nextInt(bc - fc);  
105         return new Color(r, g, b);  
106     }  
107 }

 

posted @ 2013-07-26 12:47  cgyue  阅读(299)  评论(0编辑  收藏  举报
cgyue个人博客