在B/S结构项目中,为防止别心用心的用户尝试登录通常采用生成校验码图片的方式进行控制,图片中的数字是随机生成的。以下代码是具体实现方法:   

图片生成实用类:
  1. import java.awt.*;   
  2. import java.awt.image.*;   
  3. import java.util.*;   
  4.   
  5. public class ImageCode {   
  6.   
  7.     public String sRand = "";   
  8.   
  9.     public Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色   
  10.         Random random = new Random();   
  11.         if (fc > 255)   
  12.             fc = 255;   
  13.         if (bc > 255)   
  14.             bc = 255;   
  15.         int r = fc + random.nextInt(bc - fc);   
  16.         int g = fc + random.nextInt(bc - fc);   
  17.         int b = fc + random.nextInt(bc - fc);   
  18.         return new Color(r, g, b);   
  19.     }   
  20.   
  21.     public BufferedImage creatImage() {   
  22.         // 在内存中创建图象   
  23.         int width = 60, height = 20;   
  24.         BufferedImage image = new BufferedImage(width, height,   
  25.                 BufferedImage.TYPE_INT_RGB);   
  26.         // 获取图形上下文   
  27.         Graphics g = image.getGraphics();   
  28.         // 生成随机类   
  29.         Random random = new Random();   
  30.         // 设定背景色   
  31.         g.setColor(getRandColor(200250));   
  32.         g.fillRect(00, width, height);   
  33.         // 设定字体   
  34.         g.setFont(new Font("Times New Roman", Font.PLAIN, 18));   
  35.   
  36.         // 随机产生155条干扰线,   
  37.         g.setColor(getRandColor(160200));   
  38.         for (int i = 0; i < 155; i++) {   
  39.             int x = random.nextInt(width);   
  40.             int y = random.nextInt(height);   
  41.             int xl = random.nextInt(12);   
  42.             int yl = random.nextInt(12);   
  43.             g.drawLine(x, y, x + xl, y + yl);   
  44.         }   
  45.         // 取随机产生的认证码(4位数字)   
  46.         for (int i = 0; i < 4; i++) {   
  47.             String rand = String.valueOf(random.nextInt(10));   
  48.             sRand += rand;   
  49.             // 将认证码显示到图象中   
  50.             g.setColor(new Color(20 + random.nextInt(110), 20 + random   
  51.                     .nextInt(110), 20 + random.nextInt(110)));// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成   
  52.             g.drawString(rand, 13 * i + 616);   
  53.         }   
  54.         // 图象生效   
  55.         g.dispose();   
  56.         return image;   
  57.     }   
  58.   
  59.     /**  
  60.      * @return Returns the sRand.  
  61.      */  
  62.     public String getSRand() {   
  63.         return sRand;   
  64.     }   
  65. }  
生成图片的servlet:
  1. import java.awt.image.BufferedImage;   
  2. import java.io.IOException;   
  3.   
  4. import javax.imageio.ImageIO;   
  5. import javax.servlet.ServletException;   
  6. import javax.servlet.http.HttpServlet;   
  7. import javax.servlet.http.HttpServletRequest;   
  8. import javax.servlet.http.HttpServletResponse;   
  9.   
  10. /**  
  11.  * 生成随机验证码图片  
  12.  *   
  13.  * @author lixy 2007-7-16 11:16:50  
  14.  *   
  15.  */  
  16. public class RandomImgCodeServlet extends HttpServlet {   
  17.   
  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)   
  19.             throws ServletException, IOException {   
  20.   
  21.         response.setContentType("image/jpeg");   
  22.         ImageCode image = new ImageCode();   
  23.         response.setHeader("Pragma""No-cache");   
  24.         response.setHeader("Cache-Control""no-cache");   
  25.         response.setDateHeader("Expires"0);   
  26.         try {   
  27.             // 输出图象到页面   
  28.             BufferedImage img = image.creatImage();   
  29.             request.getSession().setAttribute("rand", image.getSRand());   
  30.             //System.out.println("image Rand Code = "+image.getSRand());   
  31.             ImageIO.write(img, "JPEG", response.getOutputStream());   
  32.             response.getOutputStream().flush();   
  33.             response.getOutputStream().close();   
  34.         } catch (Exception e) {   
  35.             System.out.println("错误:" + e);   
  36.         }   
  37.     }   
  38.   
  39. }  

       记得在web.xml中对上面这个servlet进行配置,我的配置是:   

xml 代码
  1. <servlet>      
  2.     <servlet-name>RandomImgCodeServletservlet-name>      
  3.     <servlet-class>org.lixy.util.RandomImgCodeServletservlet-class>      
  4. <servlet>         
  5. <servlet-mapping>      
  6.     <servlet-name>RandomImgCodeServletservlet-name>      
  7.     <url-pattern>/servlet/randomImgCodeServleturl-pattern>      
  8. <servlet-mapping>  

 

        在需要放置此图片的地方加入如下代码: 

html代码
  1. <img src="/servlet/randomImgCodeServlet"  class="imageRandom" height="18px"/>  

        大功告成了。。。呵呵,简单吧

评论
lxy19791111 2008-07-02
老兄,知识要灵活运用...不是什么代码Copy过去就没事了!
hqingjin83 2008-06-20
<img src="/servlet/randomImgCodeServlet" class="imageRandom" height="18px"/>
这个有问题吧?应为:
<img src="servlet/randomImgCodeServlet" class="imageRandom" height="18px"/>
hqingjin83 2008-06-20
唔。。。验证码无法显示啊
hqingjin83 2008-06-20
[color=blue][/color][size=medium][/size]
很好!刚好需要,呵呵。。。
发表评论

您还没有登录,请登录后发表评论