Java生成验证码图片3

Java生成验证码图

 Java2011-09-10 13:14 77阅读 评论(0) 收藏 举报

import java.awt.Color; import java.awt.Font; import java.awt.Graphics;import java.awt.image.BufferedImage; import java.io.FileOutputStream; importjava.util.Random; import com.sun.image.codec.jpeg.JPEGCode

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.util.Random;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
  * 
功能描述:  用来生成验证码图片,测试需要,常量,方法都置成了static<br/>
*/
public class SecurityCodeCreater {
 
 
 
    //
片的 
    private final static int IMAGEWIDTH = 15;
 
    //
片的高度 
    private final static int IMAGEHEIGHT = 22;
   
 
    //
字体大小
    private final static int FONTSIZE = 18;
   
 
    //
字符串 
    private final static int CODE_LENGTH = 4;
 
   
 
    //
随机字符范 
    private final static char[] CHAR_RANGE = { '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', '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 static  void main(String[] args)throws Exception{
 
 
     //
main方法用来测试生成的验证码图
    
 
     FileOutputStream fos = newFileOutputStream("c://test.jpg");
     JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(fos);
    encoder.encode(getImage(getRandString()));    
 
}
    
 
    private static Random random = new Random(); 
 
    
 
    /**
 
     *
生成随机字符串 
     * @return
随机字符串  
     */
 
    private static String getRandString(){
 
        StringBuilder sb = newStringBuilder();
 
        for (int i = 0; i < CODE_LENGTH;i++)        
 
        
 
            sb.append(CHAR_RANGE[random.nextInt(CHAR_RANGE.length)]);
 
        return sb.toString();
 
    }
 
    
 
    /**
 
     *
生成随机 
     * @param ll
下限(lower limit) 
     * @param ul
上限(upper limit) 
     * @return
生成的随机 
     */
 
    private static Color getRandColor(int ll, int ul){
 
        if (ll > 255) ll = 255;
 
        if (ll < 1) ll = 1;
 
        if (ul > 255) ul = 255;
 
        if (ul < 1) ul = 1;
 
        if (ul == ll) ul = ll + 1;
 
        int r = random.nextInt(ul - ll) +ll;
 
        int g = random.nextInt(ul - ll) +ll;
 
        int b = random.nextInt(ul - ll) +ll;
 
        Color color = new Color(r,g,b);
 
        return color;
 
    }
 
    
 
    /**
 
     *
生成指定字符串的像数据 
     * @param verifyCode
即将被打印的随机字符串 
     * @return
生成的像数据 
     * */
 
    private static BufferedImage getImage(String verifyCode){
 
        
 
     //
生成画布
        BufferedImage image = newBufferedImage(IMAGEWIDTH * CODE_LENGTH, IMAGEHEIGHT,BufferedImage.TYPE_INT_RGB);
 
        
 
        //
形上下文(生成画笔)
        Graphics graphics =image.getGraphics();
 
        
 
        //
置背景色() 
       graphics.setColor(getRandColor(1,50));
       
 
        //
填充矩形区域,作背景
        graphics.fillRect(0, 0, IMAGEWIDTH *4, IMAGEHEIGHT);
 
        
 
        //
 
        graphics.setColor(newColor(0,255,0));
       
 
        //
画出 
        for (int i=0; i<2; i++)
 
           graphics.drawRect(i, i, IMAGEWIDTH * CODE_LENGTH - i * 2 - 1, IMAGEHEIGHT - i *2 - 1);
 
        
 
        //
置随机干扰线 
       graphics.setColor(getRandColor(50,100));
 
       
 
        //
50条干扰线 
        for (int i=0; i<50; i++){
 
            int x1 =random.nextInt(IMAGEWIDTH * CODE_LENGTH - 4) + 2;
 
            int y1 =random.nextInt(IMAGEHEIGHT - 4) + 2;
 
            int x2 =random.nextInt(IMAGEWIDTH * CODE_LENGTH - 2 - x1) + x1;
 
            int y2 = y1;
 
           graphics.drawLine(x1, y1, x2, y2);
 
        }
 
        
 
        //
置字体 
        graphics.setFont(new Font("TimesNew Roman", Font.PLAIN, FONTSIZE));
 
       
 
        //
画字符串 
        for (int i=0; i<CODE_LENGTH;i++){
 
        
 
         String temp =verifyCode.substring(i, i+1);
 
           graphics.setColor(getRandColor(100,255));
 
            graphics.drawString(temp,13 * i + 6, 16);
 
        }
 
        
 
        //
像生效 
        graphics.dispose();
 
        
 
        return image;

    }
}

验证码

有效防止这种问题对某一个特定注册用用特定程序暴力破解方式行不断的登陆尝试实际上是用验证码在很多网站通行的方式(比如招商行的网上个人行,腾讯QQ社区),我利用比较简易的方式实现个功能。然登一点,但是社区说这个功能是很有必要,也很重要。但我们还是提醒大家主要保自己的密,尽量使用混了数字、字母、符号在内的6位以上密,不要使用1234简单或者与用名相同、似的密不要因只是来iclub问问问题,就随意置密,保你自己的密也是保你自己,免得你的人盗用自己来不必要的麻 ~ 
(1
.验证码一般是防止批量注册的,人眼看起来都费劲,何况是机器。二像百度吧未登录发贴验证码大概是防止大模匿名回帖的生目前,不少网站了防止用利用机器人自注册、登、灌水,都采用了验证码。所谓验证码,就是将一串随机生的数字或符号,生成一幅片,片里加上一些干象素(防止OCR),由用肉眼识别其中的验证码信息,入表提交网站验证验证成功后才能使用某功能。 
2.一般注册用ID的地方以及各大论坛都要要验证码 
3.验证码 
1
,四位数字,随机的一数字字符串,最原始的验证码验证作用几乎零。2CSDN网站用用的是GIF格式,目前常用的随机数字验证码片上的字符比中矩,验证作用比上一个好。没有基本像学知的人,不可破!可惜取它的程序,在CSDN使用它的第一天,好像就在论坛布了,真是可怜! 
3QQ网站用用的是PNG格式,片用的随机数字+随机大写英文字母,整个构有点张扬,刷新一次,个字符位置呢!候出来的,人眼都识别不了,害啊…4MShotmail请时候的是BMP格式, 随机数字+随机大写英文字母+随机干像素+随机位置。 
5
GoogleGmail注册候的是JPG格式,随机英文字母+随机+随机位置+随机度。6,其他各大论坛的是XBM格式,内容随机。 
4)意:不少网站了防止用利用机器人自注册、登、灌水,都采用了验证码。所谓验证码,就是将一串随机生的数字或符号,生成一幅片,片里加上一些干象素(防止OCR),由用肉眼识别其中的验证码信息,入表提交网站验证验证成功后才能使用某功能

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值