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); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。