求几个图片验证码程序(数字或字母),要安全一点的,JSP 或 servlet上能运行的。

解决方案 »

  1.   


    你看看这个能用的上吗?    package test;    import java.awt.Color;
        import java.awt.Font;
        import java.awt.Graphics;
        import java.awt.image.BufferedImage;
        import java.io.OutputStream;
        import java.util.Random;    import javax.imageio.ImageIO;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        public class ImageGenerator extends HttpServlet {
          /** *//**
           *
           */
          private static final long serialVersionUID = -3938318741402322164L;      private static 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 static String charsLong = "23456789abcdefghjklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";      private static String charsShort = "0123456789";      private static String chars = charsLong;      @Override
          public void doGet(HttpServletRequest request, HttpServletResponse response) {
            try {
              int charsLength = chars.length();          response.setHeader("Pragma", "No-cache");
              response.setHeader("Cache-Control", "no-cache");
              response.setDateHeader("Expires", 0);          int width = 70, height = 20;
              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(0, 0, width, height);          g.setFont(new Font("Times New Roman", Font.ITALIC, height));          g.setColor(getRandColor(160, 200));
              for (int i = 0; i < 35; i++) {
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int xl = random.nextInt(12);
                int yl = random.nextInt(12);
                g.drawLine(x, y, x + xl, y + yl);
              }          StringBuilder sRand = new StringBuilder();
              String[] fontNames = { "Times New Roman", "Arial", "Book antiqua", "" };          for (int i = 0; i < 4; i++) {
                g.setFont(new Font(fontNames[random.nextInt(3)], Font.ITALIC, height));
                char rand = chars.charAt(random.nextInt(charsLength));
                sRand.append(rand);            g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
                g.drawString(String.valueOf(rand), 16 * i + random.nextInt(6) + 3, height - random.nextInt(4));
              }          g.setColor(getRandColor(160, 200));
              for (int i = 0; i < 30; i++) {
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int xl = random.nextInt(width);
                int yl = random.nextInt(width);
                g.drawLine(x, y, x + xl, y + yl);
              }          request.getSession().setAttribute("Login_Image_Code", sRand.toString());          g.dispose();          try {
                Thread.sleep(100);
              } catch (Exception ex) {
              }
              OutputStream os = response.getOutputStream();
              ImageIO.write(image, "JPEG", os);
              os.flush();
              os.close();
            } catch (Exception ex) {        }
          }
        }     修改 web.xml         <servlet>
                <servlet-name>imageGenerator</servlet-name>
                <servlet-class>test.ImageGenerator</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>imageGenerator</servlet-name>
                <url-pattern>/image.jsp</url-pattern>
            </servlet-mapping>
      

  2.   


    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;import com.com.business.CodeBean;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;public class CodeServlet extends HttpServlet {
    public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    response.setContentType("image/jpeg");
    ServletOutputStream out = response.getOutputStream();
    //产生缓冲图象
    BufferedImage bimg = new BufferedImage(60,30,BufferedImage.TYPE_INT_RGB);
    //产生附加码
    String code = "";
    Random r = new Random();
    for(int i = 0 ;i<4 ;i++){
    code+=r.nextInt(10);
    }
    System.out.println(code);
    request.setAttribute("code", code);
    //得到缓冲图象的绘制环境
    Graphics2D g = bimg.createGraphics();
    //绘制图象
    //清屏成白色
    g.setColor(Color.white);
    g.fillRect(0, 0, 100, 30);
    //绘制附加码
    g.setColor(Color.blue);
    g.setFont(new Font("黑体",Font.BOLD, 20));
    g.drawString(code, 10, 26);
    for(int j =0 ;j<50;j++){
    int k1 = r.nextInt(100);
    int k2 = r.nextInt(100);
    int k3 = r.nextInt(100);
    int k4 = r.nextInt(100);
    g.setColor(Color.white);
    // g.drawLine(k1, k2, k3,k4);
    g.drawOval(k1, k2, k3, k4);
    }


    //对缓冲进行编码转成jpeg
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    //输出
    encoder.encode(bimg);

    out.flush();


    }
    }
      

  3.   

    这个字母、数字都有,不知能否满足你的要求package com.servlet;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/*** 生成随机验证码* @author bitiliu**/public class ValidateCodeServlet extends HttpServlet{private static final long serialVersionUID = 1L;//验证码图片的宽度。private int width=60;//验证码图片的高度。private int height=20;//验证码字符个数private int codeCount=4;private int x=0;//字体高度private int fontHeight;private int codeY;char[] codeSequence = { A, B, C, D, E, F, G, H, I, J,K, L, M, N, O, P, Q, R, S, T, U, V, W,X, Y, Z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };/*** 初始化验证图片属性*/public void init() throws ServletException{//从web.xml中获取初始信息//宽度String strWidth=this.getInitParameter("width");//高度String strHeight=this.getInitParameter("height");//字符个数String strCodeCount=this.getInitParameter("codeCount");//将配置的信息转换成数值try{if(strWidth!=null && strWidth.length()!=0){width=Integer.parseInt(strWidth);}if(strHeight!=null && strHeight.length()!=0){height=Integer.parseInt(strHeight);}if(strCodeCount!=null && strCodeCount.length()!=0){codeCount=Integer.parseInt(strCodeCount);}}catch(NumberFormatException e){}x=width/(codeCount+1);fontHeight=height-2;codeY=height-4;}protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, java.io.IOException {//定义图像bufferBufferedImage buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics2D g = buffImg.createGraphics();//创建一个随机数生成器类Random random = new Random();//将图像填充为白色g.setColor(Color.WHITE);g.fillRect(0, 0, width, height);//创建字体,字体的大小应该根据图片的高度来定。Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);//设置字体。g.setFont(font);//画边框。g.setColor(Color.BLACK);g.drawRect(0, 0, width - 1, height - 1);//随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。g.setColor(Color.BLACK);for(int i = 0; i < 160; i++){int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(12);int yl = random.nextInt(12);g.drawLine(x, y, x + xl, y + yl);}//randomCode用于保存随机产生的验证码,以便用户登录后进行验证。StringBuffer randomCode = new StringBuffer();int red = 0, green = 0, blue = 0;//随机产生codeCount数字的验证码。for (int i = 0; i < codeCount; i++) {//得到随机产生的验证码数字。String strRand = String.valueOf(codeSequence[random.nextInt(36)]);//产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。red = random.nextInt(255);green = random.nextInt(255);blue = random.nextInt(255);//用随机产生的颜色将验证码绘制到图像中。g.setColor(new Color(red, green, blue));g.drawString(strRand, (i + 1) * x, codeY);//将产生的四个随机数组合在一起。randomCode.append(strRand);}// 将四位数字的验证码保存到Session中。HttpSession session = req.getSession();session.setAttribute("validateCode", randomCode.toString());// 禁止图像缓存。resp.setHeader("Pragma", "no-cache");resp.setHeader("Cache-Control", "no-cache");resp.setDateHeader("Expires", 0);resp.setContentType("image/jpeg");//将图像输出到Servlet输出流中。ServletOutputStream sos = resp.getOutputStream();ImageIO.write(buffImg, "jpeg", sos);sos.close();}}需要在web.xml中声明servlet<servlet><servlet-name>ValidateCodeServlet</servlet-name><servlet-class>com.servlet.ValidateCodeServlet</servlet-class><init-param><param-name>width</param-name><param-value>200</param-value></init-param><init-param><param-name>height</param-name><param-value>80</param-value></init-param><init-param><param-name>codeCount</param-name><param-value>5</param-value></init-param></servlet><servlet-mapping><servlet-name>ValidateCodeServlet</servlet-name><url-pattern>/validateCodeServlet</url-pattern></servlet-mapping>
      

  4.   

    java servlet/jsp随机验证码收藏
    package com.banding.web.util;import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;public class Image extends HttpServlet {
     
     //public static final long serialVersionUID = 1L ;
     
        //private static final String CONTENT_TYPE = "text/html; charset=GBK";    public 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);
        }    //Initialize global variables
        public void init() throws ServletException {
        }    //Process the HTTP Get request
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws
                ServletException, IOException {
            //设置页面不缓存
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);  // 在内存中创建图象
            int width = 60, height = 20;
            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(0, 0, width, height);  //设定字体
            g.setFont(new Font("Times New Roman", Font.PLAIN, 18));  //画边框
      //g.setColor(new Color());
      //g.drawRect(0,0,width-1,height-1);  // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
            g.setColor(getRandColor(160, 200));
            for (int i = 0; i < 155; i++) {
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int xl = random.nextInt(12);
                int yl = random.nextInt(12);
                g.drawLine(x, y, x + xl, y + yl);
            }  // 取随机产生的认证码(4位数字)
            String sRand = "";
            for (int i = 0; i < 4; i++) {
                String rand = String.valueOf(random.nextInt(10));
                sRand += rand;
      // 将认证码显示到图象中
                g.setColor(new Color(20 + random.nextInt(110),
                                     20 + random.nextInt(110),
                                     20 + random.nextInt(110)));
      //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
                g.drawString(rand, 13 * i + 6, 16);
            }  // 将认证码存入SESSION
            request.getSession().setAttribute("rand", sRand);  // 图象生效
            g.dispose();  // 输出图象到页面
      //ImageIO.write(image, "JPEG", response.getOutputStream());
            JPEGImageEncoder encode = JPEGCodec.createJPEGEncoder(response.
                    getOutputStream());
            encode.encode(image);    }    //Clean up resources
        public void destroy() {
        }
    } 上面的代码可以直接用,在web.xml中配置好以后就可以在浏览器中访问这个servlet,能得到下面的效果若要在jsp页面中使用这个验证码 只需用一个 <img src="那个servlet的地址" />这样就好了 这是我以前收藏的一个网摘
    http://blog.csdn.net/JavaLover00000/archive/2009/03/26/4026211.aspx
    很不错,你试试