依赖坐标:

        <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. 美团一面:什么是CAS?有什么优缺点?我说我只用过AtomicInteger。。。。

    引言 传统的并发控制手段,如使用synchronized关键字或者ReentrantLock等互斥锁机制,虽然能够有效防止资源的竞争冲突,但也可能带来额外的性能开销,如上下文切换.锁竞争导致的线程阻塞 ...

  2. 忘记root密码,破解root密码

    破解root用户密码: 1.按e进入内核参数重置界面 2.找到开头Linux的段落,行尾输入rd.break 3.按ctrl+x 进入可选步骤 5.以读写方式挂载sysyroot 修改root密码要挂 ...

  3. ETL工具-nifi干货系列 第十七讲 nifi Input Port&Out Port 实战教程

    1.端口(Port),包含输入端口(Input Port)和输出端口(Out Port ) 使用一个或多个处理组构建的数据流需要一种方式将处理组连接到其他数据流组件. 处理组和处理组之间可以通过使用端 ...

  4. python 如何判断一组数呈上升还是下降趋势

    1. python 判断一组数呈上升还是下降趋势的方法 要判断一组数(数列)是呈上升趋势.下降趋势还是无明显趋势,我们可以比较数列中相邻元素的差值.如果大部分差值都是正数,则数列呈上升趋势:如果大部分 ...

  5. C#.NET Rsa私钥加密公钥解密

    在C#中,RSA私钥只能签名,不能加密,如果要加密,要借助BouncyCastle库. nuget 中引用 Portable.BouncyCastle. 工具类: RsaEncryptUtil usi ...

  6. CentOS 7 Graylog 安装和卸载

    CentOS 7 安装 Graylog #主体思路1.安装JDK8.2.安装mongodb.3.安装Elasticsearch,并修改elasticsearch.yml 文件 .4.安装Graylog ...

  7. 思迅Pay PC ,WIN7 ,KB3042058

    思迅Pay PC ,WIN7, COM , 串口 . 577,驱动. WIN7 SHA256补丁,KB3033929,https://www.microsoft.com/zh-CN/download/ ...

  8. koishi机器docker搭建

    硬件要求: 可用内存:1G以上 存储空间:1G以上 cpu:不限制 配置: 在docker的存储空间目录建立koishi文件夹 下载docker镜像 koishijs/koishi 建立容器,具体设置 ...

  9. gitlab私有仓库搭建

    1.Gitlab介绍 我们了解了git是以个人为中心,但是人人都得数据交互呀..python程序员每天都忙着进行py交易 交互数据的方式 使用github或者码云等公有代码仓库,托管代码的地方,谁都可 ...

  10. Vulnhub Fall Walkthrough

    Recon 二层本地扫描,发现目标靶机. ┌──(kali㉿kali)-[~] └─$ sudo netdiscover -r 192.168.80.0/24 Currently scanning: ...