依赖坐标:

        <dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>1.6.2</version>
</dependency>

参考EasyCaptcha官方文档:

https://gitcode.net/mirrors/whvcse/easycaptcha?utm_source=csdn_github_accelerator

  

先上代码:

package cn.cloud9.server.test.controller;

import cn.cloud9.server.struct.common.BaseController;
import cn.cloud9.server.struct.response.NoApiResult;
import cn.cloud9.server.struct.spring.SpringContextHolder;
import cn.cloud9.server.struct.util.IpUtil;
import cn.cloud9.server.test.model.CaptchaParam;
import com.wf.captcha.SpecCaptcha;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.*; import java.awt.*;
import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.TimeUnit; /**
* @author OnCloud9
* @description 验证码测试类
* @project tt-server
* @date 2022年11月07日 下午 09:11
*/
@RestController
@RequestMapping("/test/captcha")
public class CaptchaController extends BaseController {
private static final String captchaKey = "CAPTCHA";
private static final String separator = "@";
private static final StringRedisTemplate redisTemplate = SpringContextHolder.getBean(StringRedisTemplate.class);
private static final ValueOperations<String, String> valOps = redisTemplate.opsForValue(); /**
* 获取验证码图片
* @param param 验证码生成参数对象
* @throws IOException IO异常
*/
@NoApiResult
@GetMapping("get")
public void createCaptcha(@ModelAttribute CaptchaParam param) throws IOException {
/* 三个参数分别为宽、高、位数 */
SpecCaptcha specCaptcha = new SpecCaptcha(param.getWidth(), param.getHeight(), param.getLength());
/* 设置字体 */
specCaptcha.setFont(new Font(param.getFontName(), param.getFontStyle(), param.getFontSize())); // 有默认字体,可以不用设置
/* 设置类型,纯数字、纯字母、字母数字混合 */
specCaptcha.setCharType(param.getCharType()); /* 设置验证码 */
final String text = specCaptcha.text().toUpperCase();
final String ipAddr = IpUtil.getIpAddr(request);
final String key = captchaKey + separator + ipAddr;
final boolean isUseRedis = param.isUseRedis();
if (isUseRedis) valOps.set(key, text, 5 * 60, TimeUnit.SECONDS);
else request.getSession().setAttribute(key, text); /* 输出验证码图片 */
final boolean isBase64 = param.isBase64();
if (isBase64) {
final String base64 = specCaptcha.toBase64();
response.getWriter().write(base64);
} else {
/* 设置请求头为输出图片类型 */
response.setContentType("image/gif");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0); /* 输出验证码图片 */
specCaptcha.out(response.getOutputStream());
}
} /**
* 验证图片验证码 (可以是验证码失效,错误,这里简单判断为true和false)
* @param verifyCode 图片验证码
* @param useRedis 是否使用Redis缓存
* @return 验证结果
*/
@PostMapping("verify")
public boolean verifyCaptcha(@RequestParam String verifyCode, @RequestParam(required = false) boolean useRedis) {
String storeCode = null;
final String ipAddr = IpUtil.getIpAddr(request);
final String key = captchaKey + separator + ipAddr;
if (useRedis) {
storeCode = valOps.get(key);
} else {
final Object attribute = request.getSession().getAttribute(key);
storeCode = Objects.isNull(attribute) ? "" : String.valueOf(attribute);
}
return verifyCode.equalsIgnoreCase(storeCode);
}
}

参数对象:

package cn.cloud9.server.test.model;

import com.wf.captcha.base.Captcha;
import lombok.Data; import java.awt.*; /**
* @author OnCloud9
* @description
* @project tt-server
* @date 2022年11月25日 下午 08:50
*/
@Data
public class CaptchaParam { /* 设置宽度,高度,码数长度 */
private int width = 200;
private int height = 80;
private int length = 6; /* 字体设置 */
private String fontName = "Verdana";
private int fontStyle = Font.PLAIN;
private int fontSize = 32; /**
* 验证码字符类型设置
* TYPE_DEFAULT = 1;
* TYPE_ONLY_NUMBER = 2;
* TYPE_ONLY_CHAR = 3;
* TYPE_ONLY_UPPER = 4;
* TYPE_ONLY_LOWER = 5;
* TYPE_NUM_AND_UPPER = 6;
*/
private int charType = Captcha.TYPE_ONLY_NUMBER; /* 是否使用base64 默认不使用 */
private boolean base64 = false; /* 是否使用Redis 默认不使用 */
private boolean useRedis = false;
}

  

我想,其实就算是前后端分离项目,也一样可以用Session存验证码的

手动设置验证码生成参数,前端投送参数来决定验证码的生成和存储

这里多加一个flag判断是否使用Redis存储,接口就更灵活些

设置为true时,可以检查是否走Redis了

测试校验接口是否走Redis

使用Base64编码:

【Java】EasyCaptcha 封装验证码接口的更多相关文章

  1. 理解Java的封装与接口

    1.封装,即保留有限的外部接口(interface),隐藏具体实施细节. 2.封装在生活中很常见.比如下面是一个充电电筒: 一个用户即使不看说明书,也可以猜到这个电筒的操作: 开关和充电.这个电筒用一 ...

  2. Java基础04 封装与接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型.对 ...

  3. Java基础04 封装与接口(转载)

    数据成员和方法都是同时开放给内部和外部的.在对象内部,我们利用this来调用对象的数据成员和方法.在对象外部,比如当我们在另一个类中调用对象的时,可以使用 对象.数据成员 和 对象.方法() 来调用对 ...

  4. java Vamei快速教程04 封装和接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型.对 ...

  5. java中封装,继承,多态,接口学习总结

    ### 一:封装java中封装是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通 ...

  6. C++库封装JNI接口——实现java调用c++

    1. JNI原理概述 通常为了更加灵活高效地实现计算逻辑,我们一般使用C/C++实现,编译为动态库,并为其设置C接口和C++接口.用C++实现的一个库其实是一个或多个类的简单编译链接产物.然后暴露其实 ...

  7. java基础学习总结-接口

    原文链接:http://www.cnblogs.com/xdp-gacl/p/3651121.html 一.接口的概念 JAVA是只支持单继承的,但现实之中存在多重继承这种现象,如"金丝猴是 ...

  8. Java基础05 实施接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在封装与接口中,private关键字封装了对象的内部成员.经过封装,产品隐藏了内部 ...

  9. Java命名和目录接口——JNDI

    JNDI即Java命名和目录接口(JavaNaming and Directory Interface),它属于J2EE规范范畴,是J2EE的核心技术之一,提供了一组接口.类和关于命名空间的概念.JD ...

  10. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

随机推荐

  1. itest(爱测试) 接口测试,敏捷测试管理平台 10.4.0 发布

    一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ...

  2. CF98C Help Greg the Dwarf 题解

    CF98C Help Greg the Dwarf 题解 为什么不三分? 首先我们考虑如何求出答案. 如图,考虑设夹角为 \(\theta\),那么可以得到表达式: \[[\cfrac a {\tan ...

  3. 关于 ulimit 的两个天坑

    稍微有点 Linux 经验的人一定会遇到过 "Too many open files" 错误,这个错误本质是 ulimit 设置不合理导致的.关于 ulimit 设置,有哪些需要注 ...

  4. js金额格式化

    function fmoney(s, n) //s:传入的float数字 ,n:希望返回小数点几位 { n = n > 0 && n <= 20 ? n : 2; s = ...

  5. MapStruct - 注解汇总

    @Mapper @Mapper 将接口或抽象类标记为映射器,并自动生成映射实现类代码. public @interface Mapper { // 引入其他其他映射器 Class<?>[] ...

  6. window10设置保护眼睛的颜色

    1.调出运行菜单.右击开始键选择运行,或者同时按下键盘上的WIN+R打开运行框,输入 regedit 回车转到注册表编辑器.2.选择第二项 HKEY_CURRENT_USER 点击进入.进入后点击 C ...

  7. gitlab自动定时备份文件,备份失败发送邮件

    一.需求 为预防gitlab出现故障,每天定时备份,备份完成后把之前的备份文件删除,备份成功或失败的时候自动发送邮件提醒,这里的gitlab为docker部署. 二.备份命令准备 1)备份命令 创建一 ...

  8. Linux 下使用Java连接MySQL数据库,并且实现插入、删除、选择操作

    实验环境: OS : CentOS5.5 (Linux) IDE : Eclipse DBMS : MySQL 准备工作: 1.安装 MySql . 详见http://www.cnblogs.com/ ...

  9. “国产双系统”出炉,RK3568J非对称AMP:Linux+RTOS/裸机

    "非对称AMP"双系统是什么 AMP(Asymmetric Multi-Processing),即非对称多处理架构."非对称AMP"双系统是指多个核心相对独立运 ...

  10. NXP i.MX 8M Mini工业核心板硬件说明书(四核ARM Cortex-A53 + 单核ARM Cortex-M4,主频1.6GHz)

    1          硬件资源 创龙科技SOM-TLIMX8是一款基于NXP i.MX 8M Mini的四核ARM Cortex-A53 + 单核ARM Cortex-M4异构多核处理器设计的高端工业 ...