验证码生成器类,可生成数字、大写、小写、图片字母及三者混合类型的验证码

直接复制下面的java类到项目中调用即可。


package com.tx.cd.util;

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


import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;


import com.opensymphony.xwork2.ActionContext;
 
/**  
 * 验证码生成器类,可生成数字、大写、小写字母及三者混合类型的验证码。  
 * 支持自定义验证码字符数量;  
 * 支持自定义验证码图片的大小;  
 * 支持自定义需排除的特殊字符;  
 * 支持自定义干扰线的数量;  
 * 支持自定义验证码图文颜色  
 * @author org.javachina  
 * @version 1.01  
 */  
public class VerifyCode {    
    /**  
     * 验证码类型为仅数字 0~9  
     */  
    public static final int TYPE_NUM_ONLY=0;   
    /**  
     * 验证码类型为仅字母,即大写、小写字母混合  
     */  
    public static final int TYPE_LETTER_ONLY=1;   
       
    /**  
     * 验证码类型为数字、大写字母、小写字母混合  
     */  
    public static final int TYPE_ALL_MIXED=2;   
    /**  
     * 验证码类型为数字、大写字母混合  
     */  
    public static final int TYPE_NUM_UPPER=3;          
       
    /**  
     * 验证码类型为数字、小写字母混合  
     */  
    public static final int TYPE_NUM_LOWER=4;      
       
    /**  
     * 验证码类型为仅大写字母  
     */  
    public static final int TYPE_UPPER_ONLY=5;   
       
    /**  
     * 验证码类型为仅小写字母  
     */  
    public static final int TYPE_LOWER_ONLY=6;   
       
    
    
   


    private VerifyCode(){}   
    /**  
     * 生成验证码字符串  
     * @param type 验证码类型,参见本类的静态属性  
     * @param length 验证码长度,大于0的整数  
     * @param exChars 需排除的特殊字符(仅对数字、字母混合型验证码有效,无需排除则为null)  
     * @return 验证码字符串  
     */  
    public static String generateTextCode(int type,int length,String exChars){   
           
        if(length<=0) return "";   
           
        StringBuffer code=new StringBuffer();   
        int i=0;   
        Random r=new Random();   
           
        switch(type)   
        {   
           
        //仅数字   
        case TYPE_NUM_ONLY:   
            while(i<length){   
                int t=r.nextInt(10);   
                if(exChars==null||exChars.indexOf(t+"")<0){//排除特殊字符   
                    code.append(t);   
                    i++;   
                }   
            }   
            break;   
               
        //仅字母(即大写字母、小写字母混合)   
        case TYPE_LETTER_ONLY:   
            while(i<length){   
                int t=r.nextInt(123);   
                if((t>=97||(t>=65&&t<=90))&&(exChars==null||exChars.indexOf((char)t)<0)){   
                    code.append((char)t);   
                    i++;       
                }   
            }   
            break;   
           
        //数字、大写字母、小写字母混合   
        case TYPE_ALL_MIXED:   
            while(i<length){   
                int t=r.nextInt(123);   
                if((t>=97||(t>=65&&t<=90)||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){   
                    code.append((char)t);   
                    i++;   
                }   
            }   
            break;     
               
        //数字、大写字母混合   
        case TYPE_NUM_UPPER:   
            while(i<length){   
                int t=r.nextInt(91);   
                if((t>=65||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){   
                    code.append((char)t);   
                    i++;   
                }   
            }   
            break;         
               
        //数字、小写字母混合   
        case TYPE_NUM_LOWER:   
            while(i<length){   
                int t=r.nextInt(123);   
                if((t>=97||(t>=48&&t<=57))&&(exChars==null||exChars.indexOf((char)t)<0)){   
                    code.append((char)t);   
                    i++;   
                }   
            }   
            break;         
               
        //仅大写字母   
        case TYPE_UPPER_ONLY:   
            while(i<length){   
                int t=r.nextInt(91);   
                if((t>=65)&&(exChars==null||exChars.indexOf((char)t)<0)){   
                    code.append((char)t);   
                    i++;   
                }   
            }   
            break;                 
               
        //仅小写字母   
        case TYPE_LOWER_ONLY:   
            while(i<length){   
                int t=r.nextInt(123);   
                if((t>=97)&&(exChars==null||exChars.indexOf((char)t)<0)){   
                    code.append((char)t);   
                    i++;   
                }   
            }   
            break;                 
           
        }   
           
        return code.toString();   
    }   
       
    /**  
     * 已有验证码,生成验证码图片  
     * @param textCode 文本验证码  
     * @param width 图片宽度  
     * @param height 图片高度  
     * @param interLine 图片中干扰线的条数  
     * @param randomLocation 每个字符的高低位置是否随机  
     * @param backColor 图片颜色,若为null,则采用随机颜色  
     * @param foreColor 字体颜色,若为null,则采用随机颜色  
     * @param lineColor 干扰线颜色,若为null,则采用随机颜色  
     * @return 图片缓存对象  
     */  
    public static ByteArrayInputStream generateImageCode(String textCode,int width,int height,int interLine,boolean randomLocation,Color backColor,Color foreColor,Color lineColor){   
           
           
        BufferedImage bim=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);   
        Graphics g=bim.getGraphics();   
           
        //画背景图   
        g.setColor(backColor==null?getRandomColor():backColor);   
        g.fillRect(0,0,width,height);   
           
        //画干扰线   
        Random r=new Random();   
        if(interLine>0){   
       
            int x=0,y=0,x1=width,y1=0;   
            for(int i=0;i<interLine;i++){   
                g.setColor(lineColor==null?getRandomColor():lineColor);   
                y=r.nextInt(height);   
                y1=r.nextInt(height);   
       
                g.drawLine(x,y,x1,y1);   
            }   
        }   
           
        //写验证码   
           
        //g.setColor(getRandomColor());   
        //g.setColor(isSimpleColor?Color.BLACK:Color.WHITE);   
           
        //字体大小为图片高度的80%   
        int fsize=(int)(height*0.8);   
        int fx=height-fsize;   
        int fy=fsize;   
        g.setFont(new Font(null,Font.PLAIN,fsize));   
           
        //写验证码字符   
        for(int i=0;i<textCode.length();i++){   
            fy=randomLocation?(int)((Math.random()*0.3+0.6)*height):fy;//每个字符高低是否随机   
            g.setColor(foreColor==null?getRandomColor():foreColor);   
            g.drawString(textCode.charAt(i)+"",fx,fy);   
            fx+=fsize*0.9;   
        }   
           
        g.dispose();   
         
        //dong
       
        ByteArrayInputStream input = null;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try{    
ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);    
ImageIO.write(bim, "JPEG", imageOut);    
imageOut.close();    
input = new ByteArrayInputStream(output.toByteArray());    
}catch(Exception e){     
}    
//dong


        
        
        return input;   
    }   
       
       
    /**  
     * 生成图片验证码  
     * @param type 验证码类型,参见本类的静态属性  
     * @param length 验证码字符长度,大于0的整数  
     * @param exChars 需排除的特殊字符  
     * @param width 图片宽度  
     * @param height 图片高度  
     * @param interLine 图片中干扰线的条数  
     * @param randomLocation 每个字符的高低位置是否随机  
     * @param backColor 图片颜色,若为null,则采用随机颜色  
     * @param foreColor 字体颜色,若为null,则采用随机颜色  
     * @param lineColor 干扰线颜色,若为null,则采用随机颜色  
     * @return 图片缓存对象  
     */  
    public static ByteArrayInputStream generateImageCode(int type,int length,String exChars,int width,int height,int interLine,boolean randomLocation,Color backColor,Color foreColor,Color lineColor){   
        String textCode=generateTextCode(type,length,exChars); 
ActionContext.getContext().getSession().put("loginVenifyCode", textCode);
        ByteArrayInputStream bim=generateImageCode(textCode,width,height,interLine,randomLocation,backColor,foreColor,lineColor);   
        return bim;   
    }   
       
       
    /**  
     * 产生随机颜色  
     * @return  
     */  
    private static Color getRandomColor(){   
        Random r=new Random();   
        Color c=new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255));   
        return c;   
    }   
}  



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值