java随机验证码生成实现实例代码
java随机验证码生成实现实例代码
摘要:在项目中有很多情况下都需要使用到随机验证码,这里提供一个java的随机验证码生成方案,可以指定难度,生成的验证码可以很方便的和其他组件搭配
之前要使用一个生成随机验证码的功能,在网上找了一下,有很多的人提出了不同的解决方案,但是很多人都使用了com.sun.image.这个包或者子包里面的类,而这个包结构下面的类都是不推荐使用的,我们应该依赖于java.或者javax.这些包结构下面的类,否则将来的可移植性就很不好(比如换成IBM的JDK就不行了),但是还是有人没有用这些类也做成了的,所以我就在这些代码的基础上,修改了之后做成了下面的工具类,大家可以随意使用,同时也欢迎提出改进意见。
在jdk1.7.45运行通过。
首先是验证码生成,可以选择难度:
packagecn.songxinqiang.tool.util;
importjava.util.Arrays;
publicclassRandomSecurityCode{
/**
*验证码难度级别,Simple只包含数字,Medium包含数字和小写英文,Hard包含数字和大小写英文
*/
publicenumSecurityCodeLevel{
Simple,Medium,Hard
};
//字符集合(除去易混淆的数字0、数字1、字母l、字母o、字母O)
privatefinalchar[]CHAR_CODE={'1','2','3','4','5','6',
'7','8','9','a','b','c','d','e','f','g','h','i','j',
'k','m','n','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','P','Q','R','S','T','U','V','W','X','Y','Z'};
/**
*产生默认验证码,4位中等难度
*调用此方法和调用getSecurityCode(4,SecurityCodeLevel.Medium,false)有一样的行为
*
*@see#getSecurityCode(int,SecurityCodeLevel,boolean)
*@return验证码
*/
publicchar[]getSecurityCode(){
returngetSecurityCode(4,SecurityCodeLevel.Medium,false);
}
/**
*获取验证码,指定长度、难度、是否允许重复字符
*
*@paramlength
*长度
*@paramlevel
*难度
*@paramisCanRepeat
*是否允许重复字符
*@return验证码
*/
publicchar[]getSecurityCode(intlength,SecurityCodeLevellevel,
booleanisCanRepeat){
//随机抽取len个字符
intlen=length;
char[]code;
//根据不同的难度截取字符数组
switch(level){
caseSimple:{
code=Arrays.copyOfRange(CHAR_CODE,0,9);
break;
}
caseMedium:{
code=Arrays.copyOfRange(CHAR_CODE,0,33);
break;
}
caseHard:{
code=Arrays.copyOfRange(CHAR_CODE,0,CHAR_CODE.length);
break;
}
default:{
code=Arrays.copyOfRange(CHAR_CODE,0,CHAR_CODE.length);
}
}
//字符集合长度
intn=code.length;
//抛出运行时异常
if(len>n&&isCanRepeat==false){
thrownewRuntimeException(String.format(
"调用SecurityCode.getSecurityCode(%1$s,%2$s,%3$s)出现异常,"
+"当isCanRepeat为%3$s时,传入参数%1$s不能大于%4$s",len,
level,isCanRepeat,n));
}
//存放抽取出来的字符
char[]result=newchar[len];
//判断能否出现重复的字符
if(isCanRepeat){
for(inti=0;i
下面是验证码的图片生成,可以指定图片的属性和验证码内容:
packagecn.songxinqiang.tool.util;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.image.BufferedImage;
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.util.Random;
importjavax.imageio.ImageIO;
/**
*验证码图片生成工具类
*
*@sincesxq-tool-1.0.2
*@date2014年3月11日上午10:48:02
*@author宋信强
*@mailsongxinqiang@vip.qq.com
*/
publicclassRandomSecurityImage{
privateRandomrandom=newRandom();
privateFontfont=newFont("Fixedsys",Font.CENTER_BASELINE,18);
/**
*根据指定的字符和大小生成随机验证码图片
*@paramcode需要绘制到图片上的字符数组
*@paramwidth图片宽度
*@paramheight图片高度
*@paramline干扰线数量
*@return图片的输入流
*/
publicByteArrayInputStreamgetImage(char[]code,intwidth,
intheight,intline){
//BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
BufferedImageimage=newBufferedImage(width,height,
BufferedImage.TYPE_INT_BGR);
Graphicsg=image.getGraphics();
g.fillRect(0,0,width,height);
g.setFont(newFont("TimesNewRoman",Font.ROMAN_BASELINE,18));
g.setColor(getRandColor(110,133));
//绘制干扰线
for(inti=0;i255){
fc=255;
}
if(bc>255){
bc=255;
}
intr=fc+random.nextInt(bc-fc-16);
intg=fc+random.nextInt(bc-fc-14);
intb=fc+random.nextInt(bc-fc-18);
returnnewColor(r,g,b);
}
/*
*绘制字符
*/
privatechardrowChar(Graphicsg,intx,inty,charcode){
g.setFont(font);
g.setColor(getRandColor(10,200));
g.translate(random.nextInt(3),random.nextInt(3));
g.drawString(code+"",x,y);
returncode;
}
/*
*绘制干扰线
*/
privatevoiddrowLine(Graphicsg,intwidth,intheight){
intx=random.nextInt(width);
inty=random.nextInt(height);
intxl=random.nextInt(width/2);
intyl=random.nextInt(height/2);
g.drawLine(x,y,x+xl,y+yl);
}
}
在使用上,要先生成工具类的对象(使用spring管理会很方便,或者直接做成单例模式的也行),一个使用例子:
char[]charCode=randomCode.getSecurityCode(6,SecurityCodeLevel.Hard,true);
(提前声明了的ByteArrayInputStream)inputStream=randomImage.getImage(charCode,130,34,20);
struts2返回响应配置
image/jpeg
inputStream
2048
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!