分享

servlet生产唯一图片验证码

 pengx 2008-12-18
参考了几篇文章,写了个用servlet生产唯一验证码(改造了原作者代码,在此致谢,后附链接)。附件是可直接使用的工程。明天试用一个开源项目,可以比较方便的生成各种风格的验证码,甚至还有声音,比较有意思。第一次记录自己的学习,以后争取每天写一点。
===================================================
Java代码
  1. package com.stone.study.validate;   
  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.ByteArrayOutputStream;   
  8. import java.io.IOException;   
  9.   
  10. import javax.imageio.ImageIO;   
  11. import javax.servlet.ServletException;   
  12. import javax.servlet.ServletOutputStream;   
  13. import javax.servlet.http.HttpServlet;   
  14. import javax.servlet.http.HttpServletRequest;   
  15. import javax.servlet.http.HttpServletResponse;   
  16. import javax.servlet.http.HttpSession;   
  17.   
  18. public class ImgValidateServlet2 extends HttpServlet {   
  19.     private static int WIDTH = 90;   
  20.     private static int HEIGHT = 20;   
  21.     private static int LENGTH = 6;   
  22.   
  23.     @Override  
  24.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
  25.          HttpSession session = request.getSession();   
  26.   
  27.          response.setContentType("image/jpeg");   
  28.   
  29.          ServletOutputStream sos = response.getOutputStream();   
  30.   
  31.          //设置浏览器不要缓存此图片   
  32.          response.setHeader("Pragma","No-cache");   
  33.          response.setHeader("Cache-Control","no-cache");   
  34.          response.setDateHeader("Expires"0);   
  35.   
  36.          //创建内存图象并获得其图形上下文   
  37.          BufferedImage image =    
  38.                 new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);    
  39.   
  40.          Graphics g = image.getGraphics();   
  41.   
  42.          //产生随机的认证码   
  43.          char [] rands = generateCheckCode();   
  44.   
  45.          //产生图像   
  46.          drawBackground(g);   
  47.   
  48.          drawRands(g,rands);   
  49.   
  50.          //结束图像的绘制过程,完成图像   
  51.          g.dispose();   
  52.   
  53.          //将图像输出到客户端   
  54.          ByteArrayOutputStream bos = new ByteArrayOutputStream();   
  55.   
  56.          ImageIO.write(image, "JPEG", bos);   
  57.   
  58.          byte [] buf = bos.toByteArray();   
  59.   
  60.          response.setContentLength(buf.length);   
  61.   
  62.          //下面的语句也可写成:bos.writeTo(sos);   
  63.          sos.write(buf);   
  64.          bos.close();   
  65.          sos.close();   
  66.   
  67.          //将当前验证码存入到Session或者数据库中,下一个表单处理中验证客户端提交的验证码是否正确   
  68.          session.setAttribute("check_code",new String(rands));   
  69.     }   
  70.   
  71.     private static char [] generateCheckCode()   
  72.     {   
  73.        //定义验证码的字符表   
  74.        String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";   
  75.   
  76.        char [] rands = new char[LENGTH];   
  77.        for(int i=0; i<LENGTH; i++)   
  78.   
  79.        {   
  80.           int rand = (int)(Math.random() * 36);   
  81.           rands[i] = chars.charAt(rand);   
  82.        }   
  83.   
  84.        return rands;   
  85.     }   
  86.        
  87.        private void drawRands(Graphics g , char [] rands)    
  88.        {   
  89.           g.setColor(Color.BLACK);   
  90.           g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));   
  91.   
  92.           //在不同的高度上输出验证码的每个字符            
  93.           g.drawString("" + rands[0],1,17);   
  94.           g.drawString("" + rands[1],16,15);   
  95.           g.drawString("" + rands[2],31,18);   
  96.           g.drawString("" + rands[3],46,16);   
  97.           g.drawString("" + rands[4],61,14);   
  98.           g.drawString("" + rands[5],76,19);   
  99.   
  100.           System.out.println(rands);   
  101.        }   
  102.   
  103.        private void drawBackground(Graphics g)   
  104.   
  105.        {   
  106.            //画背景   
  107.           g.setColor(new Color(0xDCDCDC));   
  108.           g.fillRect(00, WIDTH, HEIGHT);   
  109.   
  110.           //随机产生120个干扰点   
  111.           for(int i=0; i<120; i++)   
  112.   
  113.           {   
  114.              int x = (int)(Math.random() * WIDTH);   
  115.   
  116.              int y = (int)(Math.random() * HEIGHT);   
  117.   
  118.              int red = (int)(Math.random() * 255);   
  119.   
  120.              int green = (int)(Math.random() * 255);   
  121.   
  122.              int blue = (int)(Math.random() * 255);   
  123.   
  124.              g.setColor(new Color(red,green,blue));           
  125.   
  126.              g.drawOval(x,y,1,0);   
  127.   
  128.           }   
  129.              
  130.           //加两条干扰线   
  131.           g.drawLine(05905);   
  132.           g.drawLine(0159015);   
  133.   
  134.        }   
  135.   
  136.        public static void main(String args[]) {   
  137.            char[] chars = generateCheckCode();   
  138.   
  139.            System.out.println(chars);   
  140.        }   
  141. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多