众所周知,开源的图形验证码kaptcha已经广泛使用多年了,随着springboot的发展壮大,kaptcha也有了基于springboot的starter模式,这让kaptcha的使用更加的简单,下面就介绍一下如何使用kaptcha starter包来快速实现图形验证码。
引入starter包
kaptcha最早是以jar包的方式发行的,如果要使用就要引入一系列的包,而且要遵循规范引入xml的配置,并且要bean化,虽然步骤不多,但是也比较繁杂一些,自从springboot使用了starter模式,就让这些工作来的更为简单。首先在要使用kaptcha的工程中引入kaptcha的starter包。
com.baomidou kaptcha-spring-boot-starter 1.1.0
配置kaptcha
starter模式的配置是和工程主体配置一体化的,也就是放置到application.yml中,相关参数和原先的kaptcha一致,不在多述。
#图形验证码配置kaptcha: height: 50 width: 200 content: length: 4 source: 0123456789abcdefghijklmnopqrstuvwxyz space: 2 font: color: blue name: 宋体,楷体,微软雅黑 size: 40 background-color: from: lightGray to: white border: enabled: true color: black thickness: 1
开始使用
通过@Autowired注解kaptcha就可以直接使用了。
@Autowiredprivate Kaptcha kaptcha;
kaptcha只提供了三个方法:
1. 生成验证码render();
@GetMapping("/render") @ApiOperation(value = "获取图形验证码", notes = "图形验证") public void render() { kaptcha.render(); }
2. 输入码验证
@PostMapping("/valid") @ApiOperation(value = "图形验证码验证", notes = "图形验证") @ApiImplicitParams({ @ApiImplicitParam(paramType = "query", name = "code", value = "输入验证码", dataType = "String") }) public ResponseData validDefaultTime(@RequestParam String code) { ResponseData result=new ResponseData(); try { kaptcha.validate(code); result.setStatus(ResponseCode.SUCCESS); }catch (KaptchaIncorrectException e){ result.setStatus(ResponseCode.GRAPHIC_VERIFICATION_ERROR); }catch (KaptchaNotFoundException e){ result.setStatus(ResponseCode.GRAPHIC_VERIFICATION_NOTFOUND_ERROR); }catch (KaptchaRenderException e){ result.setStatus(ResponseCode.GRAPHIC_VERIFICATION_RENDER_ERROR); }catch (KaptchaTimeoutException e){ result.setStatus(ResponseCode.GRAPHIC_VERIFICATION_EXPIRED_ERROR); } return result; }
这里强调一下异常处理,validate方法只有验证成功返回true,其他错误都是通过异常暴露的,所以在程序处理的时候要捕获这些异常并进行相关处理。
3. 输入验证码超时设置验证
@PostMapping("/validTime") @ApiOperation(value = "图形验证码验证,有效期60秒", notes = "图形验证") @ApiImplicitParams({ @ApiImplicitParam(paramType = "query", name = "code", value = "输入验证码", dataType = "String") }) public ResponseData validWithTime(@RequestParam String code) { ResponseData result=new ResponseData(); try { kaptcha.validate(code,60); result.setStatus(ResponseCode.SUCCESS); }catch (KaptchaIncorrectException e){ result.setStatus(ResponseCode.GRAPHIC_VERIFICATION_ERROR); }catch (KaptchaNotFoundException e){ result.setStatus(ResponseCode.GRAPHIC_VERIFICATION_NOTFOUND_ERROR); }catch (KaptchaRenderException e){ result.setStatus(ResponseCode.GRAPHIC_VERIFICATION_RENDER_ERROR); }catch (KaptchaTimeoutException e){ result.setStatus(ResponseCode.GRAPHIC_VERIFICATION_EXPIRED_ERROR); } return result; }
这个方法和2的方法类似,只是增加了超时设置。
前端使用