阅读 676

生成图片验证码-Google Kaptcha|Java 开发实战

这是我参与更文挑战的第 4 天,活动详情查看:更文挑战

本文正在参加「Java主题月 - Java 开发实战」,详情查看:活动链接

序言

系统开发过程中,安全往往是系统设计的首要考虑因素。验证码认证、短信验证、邮件以及安全框架Shiro和Spring Secruity对应的jwt等各种认证方式。本文主要针对本人在开发过程中使用的图片验证码进行登录校验的第一步,简要描述下Google Kaptcha生成动态图片验证码的主要流程和使用过程。

开发流程

1.pom文件引入kaptcha对应的依赖

<dependency>
    <groupId>com.google.code.kaptcha</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3</version>
</dependency>
复制代码

其中,version标签中的版本号可以根据自己使用情况选择

2.controller写对应api接口生成图片验证码,并把验证码对应的key放入session,登录认证时取出key对应的验证码和前端传入的做比对。

@GetMapping("getCaptchaCode")
public void getCaptchaCode(HttpServletResponse response, HttpServletRequest request) throws ServletException, IOException {
	response.setHeader("Cache-Control", "no-store, no-cache");
	response.setContentType("image/jpeg");

	// 生成文字验证码
	String text = producer.createText();
	// 生成图片验证码
	BufferedImage image = producer.createImage(text);
	// 保存到验证码到 session
	request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY,     text);//Constants.KAPTCHA_SESSION_KEY为自己定义的存储常量

	ServletOutputStream out = response.getOutputStream();
	ImageIO.write(image, "jpg", out);
	IOUtils.closeQuietly(out);
}

复制代码

3.登录认证,将前端传送过来的验证码和session中存储的验证码做校验,匹配上返回true,然后做账号和密码的校验,反之为false,直接给出具体的错误提示信息。

// 从session中获取之前保存的验证码跟前台传来的验证码进行匹配
Object kaptcha = request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
if(kaptcha == null){
return HttpResult.error(“验证码已失效”);
}
if(!captcha.equals(kaptcha)){
return HttpResult.error(“验证码不正确”);
}
复制代码

4.此处为第2步中生成验证码引用的io关闭流工具类。众所周知,流在使用完以后,要及时关闭,比如大家常使用的文件流等,在对文件处理完毕后,要及时处理,否则将严重消耗系统资源,造成不可预知的一些问题等。此处也是如此,要对io流做及时关闭处理

public static void closeQuietly(Closeable closeable) {
    try {
        if(closeable != null) {
            closeable.close();
        }
    } catch (IOException var2) {
        ;
    }
}
复制代码

结尾

其实,验证码还有一些其他生成方式,本文只是其中一种,更普遍或者企业常用的可能是在项目中声明一个工具类,然后生成验证码对应的base64位流返回给前端,并将对应的key存入redis,然后前端利用img标签的方式,将base64位流以图片方式呈现出来。有兴趣的朋友可以参考我之前写的一篇文章(base64位流验证码生成及校验),此处不再做详细的展示。

文章分类
后端
文章标签