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 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!