注册 登录
编程论坛 J2EE论坛

验证码的设计

发布于 2010-05-01 12:36, 711 次点击
在java中如何来设计验证码吧。。
         请各位高手给点建议,方案越多越好
7 回复
#2
baifenghan2010-05-01 19:58
一般就是生成一个数组,其中包含你要用于生成动态码包含的所有字符,然后使用随机数去获取数组中的字符生成一个你指定长度的组合。简单的就直接把这个组合放在界面上。

如果你还要生成一张图片的话,有两种思路:
1. 就是放一个静态图片做这个放置这个随机数组合的背景图片;
2.使用swing的图片生成功能去动态生成一张包含这个随机数组合的图片。

建议第二种,因为第一种经常在web出现,随机码出现了,但是图片背景出不来的应用性不强的结果,但是比第二种稍微简单点。
#3
baifenghan2010-05-02 00:32
package test;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import
import
import java.util.Random;

import javax.imageio.ImageIO;

public class GenCheckCode {
   
    public static void genCheckImage(int length)
    {
        BufferedImage image = new BufferedImage(100, 25, BufferedImage.TYPE_3BYTE_BGR);
        Graphics g = image.getGraphics();
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 25);
        g.setColor(Color.YELLOW);
        String code = genCheckNumber(length);
        Font font =  new Font("宋体", Font.BOLD + Font.ITALIC, 14 );
        g.setFont(font);
        g.drawString(code, 30, 15);
        try {
            ImageIO.write(image, "jpg", new File("c:\\test.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    /**
     * 生成随机字符串
     * @param length
     * @return
     */
    public static String genCheckNumber(int length)
    {
        StringBuffer ret = new StringBuffer();
        Random ran = new Random();
        int pos = 0;
        for (int i = 0; i < length; i++) {
            pos = ran.nextInt(26 * 2 + 10);
            while (pos < 0)
            {
                pos = ran.nextInt();
            }
                ret.append(genSource()[pos]);
        }
        
        return ret.toString();
        
    }
   
    /**
     * 生产一个数组总含有小写字母和大写字母,以及数字0到9
     * @return
     */
    public static String[] genSource()
    {
        String[] source = new String[26 * 2 + 10];
        int aToInt = (int)'a';
        for (char i = 'a'; i <= 'z'; i++) {
            source[i - aToInt] = String.valueOf(i);
        }
        int AToInt = (int)'A';
        for (char i = 'A'; i <= 'Z'; i++) {
            source[i - AToInt + 26] = String.valueOf(i);
        }
        
        for (int i = 0; i < 10; i++) {
            source[i + 26 * 2] = String.valueOf(i);
        }
        
        return source;
    }
   
    public static void main(String[] args) {
        genCheckImage(5);
    }

}

我自己写了一个,你试试。
#4
2010-05-02 09:05
回复 2楼 baifenghan
非常谢谢。。我在试试
#5
2010-05-02 09:07
回复 3楼 baifenghan
那这个如何运用到web页面上去呢。。
#6
dousao2010-05-02 14:26
在页面上对这个acion自动执行一个请求就可以了,输出用image的字节数组,具体去网上找个demo看一下 很多。
#7
baifenghan2010-05-02 16:54
回复 4楼 wtuaimmmm
这个很简单了,ImageIO中有一个支持将生成的图片写到一个OutPutStream中的write重载的方法,使用这个将图片信息写到页面上也可以的。


或者将生成的图片放到指定的web应用目录,用img标签放上去就可以了。
#8
2010-05-02 21:17
回复 7楼 baifenghan
你那里有没有做好的页面,给我一个吧。。我真是拿到没有办法了。。
1