我们在网页登录的时候,经常会看到需要输入图形验证码的功能,今天我们自己来实现以下这个功能。这个功能需要两步来完成,首先我们需要开发一个图形验证码的接口,它的作用是在登录页面的表单上显示出图形验证码,然后我们还需要在认证流程中加入图形验证码的校验,下面就跟着小编一起来实现吧。
工具/原料
IntelliJIDEA
生成图形验证码
1、首先根据随机数生成图片,我们先生成验证码,创建ValidateCode类,包含code和expireTime,即验证码的数字和失效时间。创建ImageCode类继承ValidateCode。
2、接下来我们创建一个生成验证码的方法。@Get怡觎现喾Mapping("/code/image")publicvoidcreateCode(H墉掠载牿ttpServletRequestrequest,HttpServletResponseresponse){ImageCodeimageCode=createImageCode(request);}
3、接下来我来写createImageCode方瓠鲶陋啼法。/***生成验证码*@paramrequest*@return*/priva墉掠载牿teImageCodecreateImageCode(HttpServletRequestrequest){intwidth=67;intheight=23;BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphicsg=image.getGraphics();Randomrandom=newRandom();g.setColor(getRandColor(200,250));g.fillRect(0,0,width,height);g.setFont(newFont("TimesNewRoman",Font.ITALIC,20));g.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);g.drawLine(x,y,x+xl,y+yl);}StringsRand="";for(inti=0;i<4;i++){Stringrand=String.valueOf(random.nextInt(10));sRand+=rand;g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));g.drawString(rand,13*i+6,16);}g.dispose();//60秒的失效时间returnnewImageCode(image,sRand,60);}/***生成随机背景条纹**@paramfc*@parambc*@return*/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);}
4、将随机数存到session中。privateSessionStrategysessionStrategy=newHttpSessionSessionStrategy();sessionStrategy.setAttribute(newServletWebRequest(request),SESSION_KEY,imageCode);
5、再将生成的图片写到接口的响应中。ImageIO.write(imageCode.getImage(),"JPEG",response.getOutputStream());这个方法会抛出IO异常,我们继续将异常抛出即可。
6、最后我们再来介绍一下验证码校验的功能,这个功能通过过滤器Filter来实现。我们创建ValidateCodeFilter过滤器,在doFilterInternal方法中处理验证码的校验。