Java实现Web页面前数字字母验证码实现
最近公司做项目开发中用到了验证码实现功能,将实现代码分享出来, 前段页面实现代码: <ul> <li><label>验证码:</label></li> <li> <div> <inputtype="text"name="validateCode"class="login_input"value=""/> <imgid="img"src="${baseURL}/validateCode"onclick="onclickValidateCode(this);"/> </div> </li> </ul> 为了表达清晰,样式部分代码去掉了,大家根据自己的需求,自己添加样式。 页面JS代码:触发变动验证码改变的JS <scripttype="text/javascript"language="javascript"> //请求获取验证码 functiononclickValidateCode(obj){ $(obj).attr("src","${baseURL}/validateCode?"+newDate().getTime()); } </script> 后台 Controller处理: packagecom.njcc.pay.controller.login; importjava.awt.Color; importjava.awt.Font; importjava.awt.Graphics; importjava.awt.p_w_picpath.BufferedImage; importjava.io.IOException; importjava.io.OutputStream; importjava.util.Random; importjavax.p_w_picpathio.ImageIO; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.commons.lang3.math.NumberUtils; importorg.apache.commons.logging.Log; importorg.apache.commons.logging.LogFactory; importorg.springframework.stereotype.Controller; importorg.springframework.web.bind.annotation.RequestMapping; importcom.alibaba.dubbo.common.utils.StringUtils; /** *验证马Controller * *@authorAdministrator * */ @Controller publicclassValidateCodeController{ @SuppressWarnings("unused") privatestaticfinalLogLOG=LogFactory.getLog(ValidateCodeController.class); publicstaticfinalStringVALIDATE_CODE="validateCode"; privateintw=70; privateinth=23; /** *@throwsException *函数功能说明:进入后台登陆页面. * *@参数:@return *@returnString *@throws */ @RequestMapping(value="/validateCode") publicvoidvalidateCode(HttpServletRequestrequest, HttpServletResponseresponse)throwsException{ createImage(request,response); } privatevoidcreateImage(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{ response.setHeader("Pragma","no-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires",0); response.setContentType("p_w_picpath/jpeg"); Stringwidth=request.getParameter("width"); Stringheight=request.getParameter("height"); if(StringUtils.isNumeric(width)&&StringUtils.isNumeric(height)){ w=NumberUtils.toInt(width); h=NumberUtils.toInt(height); } BufferedImagep_w_picpath=newBufferedImage(w,h,BufferedImage.TYPE_INT_RGB); Graphicsg=p_w_picpath.getGraphics(); /* *生成背景 */ createBackground(g); /* *生成字符 */ Strings=createCharacter(g); request.getSession().setAttribute(VALIDATE_CODE,s); g.dispose(); OutputStreamout=response.getOutputStream(); ImageIO.write(p_w_picpath,"JPEG",out); out.close(); } /** *生成颜色 *@paramfc *@parambc *@return */ privateColorgetRandColor(intfc,intbc){ intf=fc; intb=bc; Randomrandom=newRandom(); if(f>255){ f=255; } if(b>255){ b=255; } returnnewColor(f+random.nextInt(b-f),f+random.nextInt(b-f),f+random.nextInt(b-f)); } /** *生成背景 *@paramg */ privatevoidcreateBackground(Graphicsg){ //填充背景 g.setColor(getRandColor(220,250)); g.fillRect(0,0,w,h); //加入干扰线条 for(inti=0;i<8;i++){ g.setColor(getRandColor(40,150)); Randomrandom=newRandom(); intx=random.nextInt(w); inty=random.nextInt(h); intx1=random.nextInt(w); inty1=random.nextInt(h); g.drawLine(x,y,x1,y1); } } /** *生成字符 *@paramg *@return */ privateStringcreateCharacter(Graphicsg){ char[]codeSeq={'A','B','C','D','E','F','G','H','J', 'K','M','N','P','Q','R','S','T','U','V','W', 'X','Y','Z','2','3','4','5','6','7','8','9'}; String[]fontTypes={"Arial","ArialBlack","AvantGardeBkBT","Calibri"}; Randomrandom=newRandom(); StringBuilders=newStringBuilder(); for(inti=0;i<4;i++){ Stringr=String.valueOf(codeSeq[random.nextInt(codeSeq.length)]);//random.nextInt(10)); g.setColor(newColor(50+random.nextInt(100),50+random.nextInt(100),50+random.nextInt(100))); g.setFont(newFont(fontTypes[random.nextInt(fontTypes.length)],Font.BOLD,26)); g.drawString(r,15*i+5,19+random.nextInt(8)); // g.drawString(r,i*w/4,h-5); s.append(r); } returns.toString(); } }