java生成前端验证码+验证「kaptcha」
1、前言
kaptcha是一个非常实用的短信验证码生成工具,通过简单配置即可实现多样化的验证码。
2、引入依赖
<!--第三方验证码-->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
3、前台
假设前台调用样式如下:
<img alt="验证码" width="128" height="42" @click="changeImage" src="项目地址/validate/captcha-image" ref="checkCode"/>
通过调用 /validate/captcha-image 接口地址获取验证码。
4、后台
4.1 controller
@RequestMapping("/captcha-image")
public void defaultKaptcha(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws Exception{
validateService.defaultKaptcha(httpServletRequest,httpServletResponse);
}
4.2 serviceImpl
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
DefaultKaptcha defaultKaptcha;
//验证码失效时间 15分钟
private static final int VALID_CODE_CACHE_EXPIRE_TIME = 900;
/**
* 生成图片验证码
* @param httpServletRequest request
* @param httpServletResponse response
*/
public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)throws Exception{
byte[] captchaChallengeAsJpeg = null;
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
/*生产验证码字符串并保存到session中*/
String createText = defaultKaptcha.createText();
String key = String.format("login_valid_code_%s", httpServletRequest.getSession().getId());
redisTemplate.opsForValue().set(key, createText, VALID_CODE_CACHE_EXPIRE_TIME, TimeUnit.SECONDS);
//httpServletRequest.getSession().setAttribute("vrifyCode", createText);
//使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中
BufferedImage challenge = defaultKaptcha.createImage(createText);
ImageIO.write(challenge, "jpg", jpegOutputStream);
} catch (IllegalArgumentException e) {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
//定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组
captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
httpServletResponse.setHeader("Cache-Control", "no-store");
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setDateHeader("Expires", 0);
httpServletResponse.setContentType("image/jpeg");
ServletOutputStream responseOutputStream =
httpServletResponse.getOutputStream();
responseOutputStream.write(captchaChallengeAsJpeg);
responseOutputStream.flush();
responseOutputStream.close();
}
补充:DefaultKaptcha是引入kaptcha依赖后即直接可引入的;
如上思路代码已经很清晰了,通过DefaultKaptcha创建验证码文本,然后存入redis一份,用于后面的验证使用;
注意:redis 拼接的 key 规则为 login_valid_code_ + sessionId(session id)
5、效果
前端实际应用效果:

浏览器直接调用接口效果:

6、验证
6.1 controller
从redis中取
/**
* 验证验证码
* @return Object
*/
@UnAuthorization
@RequestMapping(value = "code/check", method = {RequestMethod.POST})
public Object checkCode(@RequestBody @Valid CheckValidateRequest checkValidateRequest , BindingResult bindingResult, HttpServletRequest request) {
return validateService.checkValidateCode(httpServletRequest.getSession().getId(),checkValidateRequest.getValidCode());
}
6.2 serviceImpl
/**
* 验证短信验证码有效性
* @param mobile 手机号码 或者 sessionId
* @param validCode 验证码
* @return boolean
*/
public boolean checkValidateCode(String sessionId, String validCode) {
Object iValidCodeFromRedis = cacheService.getCache(String.format("login_valid_code_%s", sessionId));
String sValidCodeFromRedis = String.valueOf(iValidCodeFromRedis);
if (StringUtils.isNotBlank(sValidCodeFromRedis) && validCode.equalsIgnoreCase(sValidCodeFromRedis)) {
return true;
}
throw new CommonException(ValidateStatusEn.CHECK_VALID_CODE_FAILED.getErrorMsg(), ValidateStatusEn.CHECK_VALID_CODE_FAILED.getErrorCode());
}
补充:通过 login_valid_code_ + sessionId 从 redis 中获取验证码进行校验。
我创建了一个用来记录自己学习之路的公众号,感兴趣的小伙伴可以关注一下微信公众号:niceyoo

java生成前端验证码+验证「kaptcha」的更多相关文章
- Java生成随机验证码
package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
- java生成简单验证码图片
概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在ja ...
- 如何用java生成随机验证码
1.VerifyCode 类: 1 package com.HRuinger.enity; ImageIO.write(image, " ...
- java生成图形验证码
效果图 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buf ...
- java生成汉字验证码
java实现的汉字输入验证码,主要包含两个类,一个是生成验证码,一个是判断验证码输入是否正确,实现原理非常简单,将汉字和干扰线生成图片并将汉字保存到session,前台获取每次生成验证码图片并用文本框 ...
- java生成一次性验证码
1.编写生成验证码的工具类: import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.aw ...
- java生成动态验证码
import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;impor ...
- java生成随机验证码图片
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; i ...
- Java生成验证码并进行验证(转)
本文转自http://blog.csdn.net/worm0527/article/details/51030864 一.实现思路 使用BufferedImage用于在内存中存储生成的验证码图片 使用 ...
随机推荐
- 编译和安装openssl
linux安装了Python3.7之后, pip不好用了,报错如下: pip is configured with locations that require TLS/SSL, however th ...
- JS比较软件版本号
JS比较软件版本号 版本号格式为:a.b.c 1.获取版本号中的数字 function toNumber(n) { // 使用正则表达式,截取字符串为数组,字符串中包含非数值型,如字母,则数组元素中会 ...
- RecyclerView预览数据
我们在布局文件里定义RecyclerView时,可以使用tools属性预览数据,如下: <android.support.v7.widget.RecyclerView android:layou ...
- golang学习笔记----并发
并发模型 并发目前来看比较主流的就三种: 多线程:每个线程一次处理一个请求,线程越多可并发处理的请求数就越多,但是在高并发下,多线程开销会比较大. 协程:无需抢占式的调度,开销小,可以有效的提高线程的 ...
- SpringCloud 别人的主页
https://www.cnblogs.com/xuwujing/ java(28) springBoot(14) 设计模式(14) springcloud(7) hadoop(7) hive(5) ...
- WPF 精修篇 Winform 嵌入WPF控件
原文:WPF 精修篇 Winform 嵌入WPF控件 首先 创建WPF控件库 这样就有了一个WPF界面 在wpf中增加界面等 在winform中增加WPFDLL 重新生成解决方案 在左侧工具栏 出现W ...
- WPF 精修篇 缩放ScaleTransform
原文:WPF 精修篇 缩放ScaleTransform 缩放 ScaleTransform 参数 ScaleX X轴缩小值 正常为1 ScaleY Y轴缩小值 正常为1 CenterY ,Cente ...
- 外网IP和内网IP区别
外网IP和内网IP区别? 网络结构 如图,假设我们的计算机现在就是设备一,我们想要访问百度.如果我们正使用着校园网,那么首先我们需要先通过校园网的路由器把我们的内网ip转为校园网的外网ip.然后通过这 ...
- 初始认知学习 .net core 逐步加深
1.一般用空项目练手 2.一般你已经有数据库的情况下使用如下的方式 开始生成类的操作 这里我使用的是Database First模式,使用工具Scaffold-DbContext(数据库上下文脚手架) ...
- 看一下“Dubbo 2.7”的三大新特性
Dubbo 2.7.x 作为 Apache 的孵化版本,除了代码优化之外,还新增了许多重磅的新特性,本文将会介绍其中最典型的三个新特性: 一.异步化改造 二.三大中心改造 三.服务治理增强 一.异步支 ...