使用 Happy Captcha,一行代码生成验证码。
这里做一个整理和记录:
引入jar包:
<dependency> <groupId>com.ramostear</groupId> <artifactId>Happy-Captcha</artifactId> <version>1.0.1</version> </dependency>
开始使用,只需一行代码就可以生成验证码:
@Controller public class HappyCaptchaController{ @GetMapping("/captcha") public void happyCaptcha(HttpServletRequest reqeust,HttpServletResponse response){ HappyCaptcha.require(request,response).build().finish(); } }
这里还可以使用链式编程,对验证码的一些属性进行设置:
public void happyCaptcha(HttpServletRequest reqeust, HttpServletResponse response){ HappyCaptcha.require(reqeust,response) .style(CaptchaStyle.IMG) //设置展现样式为图片 .length(4) //设置字符长度为4 .width(220) //设置动画宽度为220 .height(80) //设置动画高度为80 .build().finish(); //生成并输出验证码; }
实现效果如下:
如果CaptchaStyle设置为CaptchaStyle.ANIM,生成的验证码还会有动画效果。
打开finish方法的源码。我们可以看到生成的验证码是放在session中了:
captcha.setLength(this.length); captcha.setFont(this.font); this.setHeader(this.response); this.request.getSession().setAttribute("happy-captcha", captcha.getCaptchaCode()); captcha.render(this.response.getOutputStream()); return true;```
所以,使用过的验证码要从session中清除, Happy Captcha提供了这样的方法来实现:
public void removeCaptcha(HttpServletRequest request){ HappyCaptcha.remove(request); }
最后就是对于验证码的校验:
public String verify(String code,HttpServletRequest request){ //Verification Captcha boolean flag = HappyCaptcha.verification(request,code,true); if(flag){ //Other operations... } return code; }
打开verification方法的源码,我们可以看到:
if (code != null && !code.trim().equals("")) { String captcha = (String)request.getSession().getAttribute("happy-captcha"); return ignoreCase ? code.equalsIgnoreCase(captcha) : code.equals(captcha); } else { return false; }
就是从session中取出刚才存入的验证码,然后与输入的验证码code进行对比。