java验证码生成具体代码
本文实例为大家分享了java验证码生成的示例代码,供大家参考,具体内容如下
packagecom.gonvan.component.captcha;
importjava.awt.*;
importjava.awt.image.BufferedImage;
importjava.io.IOException;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Random;
importjavax.imageio.ImageIO;
importjavax.servlet.ServletOutputStream;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
/**
*Createdbyyuerzmon2016/3/14.
*/
publicclassCaptchaFactory{
privatestaticfinalchar[]CODE_SEQUENCE="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
.toCharArray();
privatestaticfinalintDEFAULT_WIDTH=60;
privatestaticfinalintDEFAULT_HEIGHT=20;
privatestaticfinalintDEFAULT_CODE_LEN=4;
privatestaticfinalintDEFAULT_CODE_X=13;
privatestaticfinalintDEFAULT_CODE_Y=16;
privatestaticfinalintDEFAULT_FONT_SIZE=18;
privatestaticfinalStringDEFAULT_FONT_FAMILY="TimesNewRoman";
privatestaticCaptchaFactoryinstance=newCaptchaFactory();
privateintwidth=DEFAULT_WIDTH;//定义图片的width
privateintheight=DEFAULT_HEIGHT;//定义图片的height
privateintlength=DEFAULT_CODE_LEN;//定义图片上显示验证码的个数
privateintxx=DEFAULT_CODE_X;//定义图片上显示验证码x坐标
privateintyy=DEFAULT_CODE_Y;//定义图片上显示验证码y坐标
privateintfontSize=DEFAULT_FONT_SIZE;//定义图片上显示验证码的字体大小
privateStringfontFamily=DEFAULT_FONT_FAMILY;//定义图片上显示验证码的个数
privateCaptchaFactory(){
}
publicstaticCaptchaFactorygetInstance(){
returninstance;
}
/**
*配置宽高
*
*@paramw
*@paramh
*@return
*/
publicCaptchaFactoryconfigWidthAndHeight(intw,inth){
instance.width=w;
instance.height=h;
returninstance;
}
/**
*配置坐标
*
*@paramx
*@paramy
*@return
*/
publicCaptchaFactoryconfigXY(intx,inty){
instance.xx=x;
instance.yy=y;
returninstance;
}
/**
*配置字体大小
*
*@paramfontSize
*@return
*/
publicCaptchaFactoryconfigFontSize(intfontSize){
instance.fontSize=fontSize;
returninstance;
}
/**
*配置字体
*
*@paramfontFamily
*@return
*/
publicCaptchaFactoryconfigFontSize(StringfontFamily){
instance.fontFamily=fontFamily;
returninstance;
}
publicvoidwrite(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{
//将四位数字的验证码保存到Session中。
Mapcaptcha=generate();
StringrandomCode=(String)captcha.get("captchaCode");
BufferedImagebuffImg=(BufferedImage)captcha.get("captchaImg");
HttpSessionsession=request.getSession();
session.setAttribute("code",randomCode);
//禁止图像缓存。
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
response.setContentType("image/jpeg");
//将图像输出到Servlet输出流中。
ServletOutputStreamoutputStream=response.getOutputStream();
ImageIO.write(buffImg,"jpeg",outputStream);
outputStream.close();
}
publicMap<String,Object>generate()throwsIOException{
//定义图像buffer
BufferedImagebuffImg=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphicsgd=buffImg.getGraphics();
//设定背景色
gd.setColor(getRandColor(200,250));
gd.fillRect(0,0,width,height);
//设定字体,字体的大小应该根据图片的高度来定。
gd.setFont(newFont(fontFamily,Font.PLAIN,fontSize));
//创建一个随机数生成器类
Randomrandom=newRandom();
//随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。
gd.setColor(getRandColor(160,200));
for(inti=0;i<155;i++){
intx=random.nextInt(width);
inty=random.nextInt(height);
intxl=random.nextInt(12);
intyl=random.nextInt(12);
gd.drawLine(x,y,x+xl,y+yl);
}
//randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBufferrandomCode=newStringBuffer();
intred=0,green=0,blue=0;
//随机产生length个验证码。
for(inti=0;i<length;i++){
//得到随机产生的验证码数字。
Stringcode=String.valueOf(CODE_SEQUENCE[random.nextInt(36)]);
//产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
red=random.nextInt(110);
green=random.nextInt(110);
blue=random.nextInt(110);
//用随机产生的颜色将验证码绘制到图像中。
gd.setColor(newColor(red+20,green+20,blue+20));
gd.drawString(code,i*xx+6,yy);
//将产生的随机数组合在一起。
randomCode.append(code);
}
Map<String,Object>retval=newHashMap<>();
retval.put("captchaCode",randomCode.toString());
retval.put("captchaImg",buffImg);
returnretval;
}
/**
*给定范围获得随机颜色
*
*@paramfc
*最小值
*@parambc
*最大值
*@returnColor
*/
privateColorgetRandColor(intfc,intbc){
Randomrandom=newRandom();
if(fc>255)
fc=255;
if(bc>255)
bc=255;
intr=fc+random.nextInt(bc-fc);
intg=fc+random.nextInt(bc-fc);
intb=fc+random.nextInt(bc-fc);
returnnewColor(r,g,b);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。