,宋哥也给大家讲过验证码的使用方法,不过里面的验证码是自己写的,功能其实挺齐全的。足够的。不过现在各个网站验证码的玩法越来越多,而最近TienChin项目使用的验证码是一个老的开源库kaptcha,所以宋哥决定花点时间和大家聊聊kaptcha的用法.毕竟这个16年的老玩意儿还在用,可见它的功能还是相当强大的。一、基本使用kaptcha是一个很老的验证码生成工具,有多少年了?最早可以追溯到2006年,这么多年过去了,它不仅不寂寞,而且还有很多人在使用,足以说明它的生命力,值得研究。为了方便起见,我们有一个完整的SpringBoot工程来演示它的用法。首先新建一个SpringBoot项目,然后添加kaptcha依赖,如下:com.github.pengglekaptcha2.3.2接下来,我们只需要提供一个Bean来配置Kaptcha,如下:属性properties=newProperties();//是否有边框默认为true。我们可以自己设置yes,noproperties.setProperty(KAPTCHA_BORDER,"yes");//验证码文字字符默认颜色为Color.BLACKproperties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR,"black");//验证码图片默认宽度为200properties.setProperty(KAPTCHA_IMAGE_WIDTH,"160");//验证码图片默认高度为50properties.setProperty(KAPTCHA_IMAGE_HEIGHT,"60");//验证码文本的字符大小默认为40properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE,"38");//验证码HA_SESSION_KEYproperties.setProperty(KAPTCHA_SESSION_CONFIG_KEY,"kaptchaCode");//验证码文本默认字符长度为5properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH,"4");//验证码文字默认字体样式为newFont("Arial",1,fontSize),newFont("Courier",1,fontSize)properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES,"Arial,Courier");//图片风格水纹com.google.code.kaptcha.impl.WaterRipplefisheyecom.google.code.kaptcha.impl.FishEyeGimpyShadowcom.google.code.kaptcha.impl.ShadowGimpyproperties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL,"com.google.code.kaptcha.impl.ShadowGimpy");配置配置=新配置(属性);defaultKaptcha.setConfig(配置);返回默认验证码;}}DefaultKaptcha配置DefaultKaptcha中验证码图片各属性值的含义。代码里有注释,就不多说了。接下来我们在接口中返回验证码图片,如下:BufferedImageimage=defaultKaptcha.createImage(文本);ImageIO.write(image,"jpg",resp.getOutputStream());}这里我把图片通过IO流写到前端,当然也可以转成Base64字符串返回给前端结束也行。等等,好像少了什么!我们没有将生成的验证码文本保存到session中,这样以后登录的时候就无法验证了。可能有朋友会说,这还不简单?将其保存在界面中并不容易。就是这样?不不不!你看,我们在配置DefaultKaptchabean的时候,有这么一行代码properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY,"kaptchaCode");,这行代码的意思是生成的验证码文本会自动存储到session中,并且会话的KEY是kaptchaCode。但是在实际测试中,你会发现上面的代码并没有将验证码生成的文本存储到session中。原因是Kaptcha工具其实提供了一个生成验证码图片的Servlet。如果我们直接使用Servlet自己提供的验证码,那么上面的配置就会生效。在SpringBoot中,如果要配置Kaptcha自己提供的Servlet,方法如下:bean.setServlet(newKaptchaServlet());bean.addUrlMappings("/img");属性=属性新属性();//是否有边框默认为true,我们可以自己设置yes,没有properties.setProperty(KAPTCHA_BORDER,"yes");//验证码文字字符默认颜色为Color.BLACKproperties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR,"black");//验证码图片默认宽度为200properties.setProperty(KAPTCHA_IMAGE_WIDTH,"160");//验证码图片默认高度为50properties.setProperty(KAPTCHA_IMAGE_HEIGHT,"60");//验证码文本字符默认大小为40properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE,"38");//KAPTCHA_SESSION_KEYproperties.setProperty(KAPTCHA_SESSION_CONFIG_KEY,"kaptchaCode");//验证码文本字符长度默认为5个属性es.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH,"4");//验证码文字字体样式默认为newFont("Arial",1,fontSize),newFont("Courier",1,fontSize)properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES,"Arial,Courier");//图像样式水纹com.google.code.kaptcha.impl.WaterRipple鱼眼com.google.code.kaptcha.impl.FishEyeGimpy阴影com.google.code.kaptcha.impl.ShadowGimpy属性。setProperty(KAPTCHA_OBSCURIFICATOR_IMPL,"com.google.code.kaptcha.impl.ShadowGimpy");Mapmap=newHashMap((Map)properties);bean.setInitParameters(地图);returnbean;}项目启动后,直接访问/img可以看到验证码的图片。这时,验证码的文本也会自动存储到session中。用户登录时,可以通过session.getAttribute("kaptchaCode")获取到验证码的文本内容。但是很多时候,验证码接口返回的内容是比较丰富的,可能不仅仅是图片,还有其他信息。因此,我们可以直接配置一个Servlet来满足我们的要求。我们只能自己写验证码接口了。如果我们自己写的话,一定要把验证码图片保存在session里面,然后properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY,"kaptchaCode");配置其实没什么用,不用加。2.自定义验证码文本当然我们也可以自定义验证码文本,只需要提供一个验证码文本的实现类即可,如下:publicclassKaptchaTextCreatorextendsDefaultTextCreator{privatestaticfinalString[]CNUMBERS="0,1,2,3,4,5,6,7,8,9,10".split(",");@OverridepublicStringgetText(){整数结果=0;随机random=newRandom();intx=random.nextInt(10);inty=random.nextInt(10);StringBuildersuChinese=newStringBuilder();intrandomoperands=(int)Math.round(Math.random()*2);如果(随机操作数==0){结果=x*y;suChinese.append(CNUMBERS[x]);suChinese.append("*");suChinese.append(CNUMBERS[y]);}elseif(randomoperands==1){if(!(x==0)&&y%x==0){result=y/x;suChinese.append(CNUMBERS[y]);suChinese.append("/");suChinese.append(CNUMBERS[x]);}否则{结果=x+y;suChinese.append(CNUMBERS[x]);suChinese.append("+");suChinese.append(CNUMBERS[y]);}}elseif(randomoperands==2){if(x>=y){结果=x-y;suChinese.append(CNUMBERS[x]);suChinese.append("-");suChinese.append(CNUMBERS[y]);}else{结果=y-x;suChinese.append(CNUMBERS[y]);suChinese.append("-");suChinese.append(CNUMBERS[x]);}}else{结果=x+y;suChinese.append(CNUMBERS[x]);suChinese.append("+");suChinese.append(CNUMBERS[y]);}suChinese.append("=?@"+result);返回suChinese.toString();}}这段代码不难理解,生成的验证码文字类似于1+1=?@2。以后会以@作为分界线,将@之前的字符串内容绘制到图片上,@之后的内容存储到session中,与用户上传的内容进行比较。能。当然,我们还需要在配置验证码的时候添加如下属性来修改验证码文本的提供类:配置完成后,以后就可以直接在界面中使用这个验证码了。使用时注意将生成的验证码文本进行拆分处理。一部分用于绘图,另一部分用于在会话中保存。