验证码功能位于cn.hutool.captcha
包中,核心接口为ICaptcha
,此接口定义了以下方法:
createCode
创建验证码,实现类需同时生成随机验证码字符串和验证码图片getCode
获取验证码的文字内容verify
验证验证码是否正确,建议忽略大小写write
将验证码写出到目标流中其中write方法只有一个OutputStream
,ICaptcha
实现类可以根据这个方法封装写出到文件等方法。
AbstractCaptcha
为一个ICaptcha
抽象实现类,此类实现了验证码文本生成、非大小写敏感的验证、写出到流和文件等方法,通过继承此抽象类只需实现createImage
方法定义图形生成规则即可。
LineCaptcha
线段干扰的验证码贴栗子:
//定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
//图形验证码写出,可以写出到文件,也可以写出到流
lineCaptcha.write("d:/line.png");
//输出code
Console.log(lineCaptcha.getCode());
//验证图形验证码的有效性,返回boolean值
lineCaptcha.verify("1234");
//重新生成验证码
lineCaptcha.createCode();
lineCaptcha.write("d:/line.png");
//新的验证码
Console.log(lineCaptcha.getCode());
//验证图形验证码的有效性,返回boolean值
lineCaptcha.verify("1234");
CircleCaptcha
圆圈干扰验证码贴栗子:
//定义图形验证码的长、宽、验证码字符数、干扰元素个数
CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
//CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);
//图形验证码写出,可以写出到文件,也可以写出到流
captcha.write("d:/circle.png");
//验证图形验证码的有效性,返回boolean值
captcha.verify("1234");
ShearCaptcha
扭曲干扰验证码贴栗子:
//定义图形验证码的长、宽、验证码字符数、干扰线宽度
ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
//ShearCaptcha captcha = new ShearCaptcha(200, 100, 4, 4);
//图形验证码写出,可以写出到文件,也可以写出到流
captcha.write("d:/shear.png");
//验证图形验证码的有效性,返回boolean值
captcha.verify("1234");
ICaptcha captcha = ...;
captcha.write(response.getOutputStream());
//Servlet的OutputStream记得自行关闭哦!
/**
* 生成图像验证码
* @param response response请求对象
* @throws IOException
*/
@ApiOperation(value="生成图像验证码", notes = "")
@GetMapping(value = CIIPCommonConstant.ApiAuth.ANON+"/register/generateValidateCode")
public void generateValidateCode(HttpServletResponse response) throws IOException{
//设置response响应
response.setCharacterEncoding("UTF-8");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
//把图形验证码凭证放入cookie中
String tokenId = UUID.randomUUID().toString();
Cookie cookie = new Cookie("imgCodeToken",tokenId);
cookie.setPath("/");
response.addCookie(cookie);
//定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(126, 30,4,150);
int time=60;
//把凭证对应的验证码信息保存到reids(可从redis中获取)
redisUtil.setWithExpireTime(CIIPCommonConstant.CIIP_PROTAL,CIIPCommonConstant.VDLIDATE_CODE_IMG_KEY+tokenId, lineCaptcha.getCode(),time);
//输出浏览器
OutputStream out=response.getOutputStream();
lineCaptcha.write(out);
out.flush();
out.close();
}