java图形验证码生成工具类 web页面校验验证码
最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善。
验证码生成器:
importjavax.imageio.ImageIO;
importjava.awt.*;
importjava.awt.image.BufferedImage;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.util.Date;
importjava.util.Random;
/**
*验证码生成器
*
*@author
*/
publicclassValidateCode{
//图片的宽度。
privateintwidth=160;
//图片的高度。
privateintheight=40;
//验证码字符个数
privateintcodeCount=5;
//验证码干扰线数
privateintlineCount=150;
//验证码
privateStringcode=null;
//验证码图片Buffer
privateBufferedImagebuffImg=null;
//验证码范围,去掉0(数字)和O(拼音)容易混淆的(小写的1和L也可以去掉,大写不用了)
privatechar[]codeSequence={'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','1','2','3','4','5','6','7','8','9'};
/**
*默认构造函数,设置默认参数
*/
publicValidateCode(){
this.createCode();
}
/**
*@paramwidth图片宽
*@paramheight图片高
*/
publicValidateCode(intwidth,intheight){
this.width=width;
this.height=height;
this.createCode();
}
/**
*@paramwidth图片宽
*@paramheight图片高
*@paramcodeCount字符个数
*@paramlineCount干扰线条数
*/
publicValidateCode(intwidth,intheight,intcodeCount,intlineCount){
this.width=width;
this.height=height;
this.codeCount=codeCount;
this.lineCount=lineCount;
this.createCode();
}
publicvoidcreateCode(){
intx=0,fontHeight=0,codeY=0;
intred=0,green=0,blue=0;
x=width/(codeCount+2);//每个字符的宽度(左右各空出一个字符)
fontHeight=height-2;//字体的高度
codeY=height-4;
//图像buffer
buffImg=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics2Dg=buffImg.createGraphics();
//生成随机数
Randomrandom=newRandom();
//将图像填充为白色
g.setColor(Color.WHITE);
g.fillRect(0,0,width,height);
//创建字体,可以修改为其它的
Fontfont=newFont("Fixedsys",Font.PLAIN,fontHeight);
//Fontfont=newFont("TimesNewRoman",Font.ROMAN_BASELINE,fontHeight);
g.setFont(font);
for(inti=0;i"+path);
vCode.write(path);
}catch(IOExceptione){
e.printStackTrace();
}
}
}
下面是页面JS调用验证码
//刷新图片
functionchangeImg(){
varimgSrc=$("#imgObj");
varurl=imgSrc.attr("src");
imgSrc.attr("src",changeUrl(url));
}
//为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳
functionchangeUrl(url){
vartimestamp=(newDate()).valueOf();
varindex=url.indexOf("?");
console.log(index);
if(index>0){
url=url.substring(0,url.indexOf("?"));
}
console.log(url);
if((url.indexOf("&")>0)){
url=url+"×tamp="+timestamp;
console.log(url);
}else{
url=url+"?timestamp="+timestamp;
console.log(url);
}
returnurl;
}
下面是controller层输出验证码
/**
*响应验证码页面
*@return
*/
@RequestMapping(value="/validateCode")
publicStringvalidateCode(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
//设置响应的类型格式为图片格式
response.setContentType("image/jpeg");
//禁止图像缓存。
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
HttpSessionsession=request.getSession();
ValidateCodevCode=newValidateCode(120,40,5,100);
session.setAttribute("code",vCode.getCode());
vCode.write(response.getOutputStream());
returnnull;
}
下面是controller层验证验证码输入是否正确
Stringcode=request.getParameter("code");
HttpSessionsession=request.getSession();
StringsessionCode=(String)session.getAttribute("code");
if(!StringUtils.equalsIgnoreCase(code,sessionCode)){//忽略验证码大小写
thrownewRuntimeException("验证码对应不上code="+code+"sessionCode="+sessionCode);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。