


1. 什么是EasyCaptcha?
Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。
源码地址: https://github.com/whvcse/EasyCaptcha
2. 添加依赖
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>1.6.2</version>
</dependency>复制
以下内容是对EasyCaptcha封装,生成的验证码储存到redis中。
3. 创建验证码接口
新建文件: EasyCaptchaService.java
package com.hui.javalearn.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 验证码类
* https://github.com/whvcse/EasyCaptcha
*/
public interface EasyCaptchaService {
/**
* 验证码宽度
*/
Integer CAPTCHA_WIDTH = 130;
/**
* 验证码高度
*/
Integer CAPTCHA_HEIGHT = 48;
/**
* 验证码长度
*/
Integer CAPTCHA_LENGTH = 4;
/**
* 验证码缓存key前缀
*/
String CAPTCHA_KEY_PRE = "CAPTCHA:LIST:";
/**
* 验证码缓存时间
*/
Integer CAPTCHA_CACHE_TIME = 120;
/**
* 验证码类型: 默认图片
* */
int CAPTCHA_TYPE_DEFAULT_PNG = 10;
/**
* 验证码类型: 动态GIF
* */
final int CAPTCHA_TYPE_GIF = 20;
/**
* 验证码类型: 中文
* */
final int CAPTCHA_TYPE_CHINESE = 30;
/**
* 验证码类型: 动态中文
* */
final int CAPTCHA_TYPE_GIF_CHINESE = 40;
/**
* 验证码类型: 算术
* */
final int CAPTCHA_TYPE_ARITHMETIC = 50;
/**
* 生成普通图片验证码
* @param uuid
* @param request
* @param response
* @return
*/
String outputCaptchaImg(String uuid, Integer type,HttpServletRequest request, HttpServletResponse response) throws IOException;
/**
* 校验图片验证码
* @param uuid
* @param captchaCode
* @return
*/
boolean verifyCaptchaCode(String uuid,String captchaCode);
}复制
4. 实现验证码接口
新建文件: EasyCaptchaServiceImpl.java
package com.hui.javalearn.service.Impl;
import com.hui.javalearn.common.enums.ResultEnum;
import com.hui.javalearn.exception.ApiException;
import com.hui.javalearn.service.EasyCaptchaService;
import com.wf.captcha.*;
import com.wf.captcha.utils.CaptchaUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Service
public class EasyCaptchaServiceImpl implements EasyCaptchaService {
/**
* 注入redis
*/
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 保存验证码到缓存
*
* @param uuid
* @param codeValue
*/
private void saveCaptcha2Cache(String uuid, String codeValue) {
stringRedisTemplate.opsForValue().set(CAPTCHA_KEY_PRE + uuid, codeValue, CAPTCHA_CACHE_TIME, TimeUnit.SECONDS);
}
/**
*
* @param uuid
* @param type
* @param request
* @param response
* @return
* @throws IOException
*/
@Override
public String outputCaptchaImg(String uuid, Integer type, HttpServletRequest request, HttpServletResponse response) throws IOException {
String codeValue="";
switch (type) {
case CAPTCHA_TYPE_DEFAULT_PNG:
SpecCaptcha specCaptcha = new SpecCaptcha(CAPTCHA_WIDTH,CAPTCHA_HEIGHT,CAPTCHA_LENGTH);
codeValue = specCaptcha.text().toLowerCase();
CaptchaUtil.out(specCaptcha,request,response);
break;
case CAPTCHA_TYPE_GIF:
GifCaptcha gifCaptcha = new GifCaptcha(CAPTCHA_WIDTH, CAPTCHA_HEIGHT, CAPTCHA_LENGTH);
codeValue = gifCaptcha.text().toLowerCase();
CaptchaUtil.out(gifCaptcha,request,response);
break;
case CAPTCHA_TYPE_CHINESE:
ChineseCaptcha chineseCaptcha = new ChineseCaptcha(CAPTCHA_WIDTH,CAPTCHA_HEIGHT,CAPTCHA_LENGTH);
codeValue = chineseCaptcha.text();
CaptchaUtil.out(chineseCaptcha,request,response);
break;
case CAPTCHA_TYPE_GIF_CHINESE:
ChineseGifCaptcha chineseGifCaptcha = new ChineseGifCaptcha(CAPTCHA_WIDTH, CAPTCHA_HEIGHT, CAPTCHA_LENGTH);
codeValue = chineseGifCaptcha.text();
CaptchaUtil.out(chineseGifCaptcha,request,response);
break;
case CAPTCHA_TYPE_ARITHMETIC:
ArithmeticCaptcha arithmeticCaptcha = new ArithmeticCaptcha(CAPTCHA_WIDTH,CAPTCHA_HEIGHT);
codeValue = arithmeticCaptcha.text();
CaptchaUtil.out(arithmeticCaptcha,request,response);
break;
default:
throw new IOException("类型不存在");
}
saveCaptcha2Cache(uuid,codeValue);
return codeValue;
}
/**
* 校验图片验证码
* @param uuid
* @param captchaCode
* @return
*/
@Override
public boolean verifyCaptchaCode(String uuid, String captchaCode) {
String cacheCaptchaCode = stringRedisTemplate.opsForValue().get(CAPTCHA_KEY_PRE + uuid);
if (StringUtils.isBlank(cacheCaptchaCode)) {
throw new ApiException(ResultEnum.ERROR.getCode(),"图形验证码超时,请重新获取!");
}
if (!cacheCaptchaCode.equals(captchaCode.toLowerCase())){
throw new ApiException(ResultEnum.ERROR.getCode(),"图形验证码输入不正确!");
}
return true;
}
}复制
5. 使用
5.1 生成验证码
新建文件: CaptchaController.java
package com.hui.javalearn.controller;
import com.hui.javalearn.service.EasyCaptchaService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import java.io.IOException;
@Api(tags = "验证码")
@RestController
@RequestMapping("/captcha")
public class CaptchaController {
@Autowired
private EasyCaptchaService captchaService;
@GetMapping("/generate")
@ApiOperation("生成验证码")
public void generate(
HttpServletRequest request,
HttpServletResponse response,
@NotEmpty(message = "uuid不能为空") @RequestParam("uuid") String uuid
) throws IOException {
captchaService.outputCaptchaImg(uuid,EasyCaptchaService.CAPTCHA_TYPE_GIF,request,response);
}
}复制
5.2 校验验证码
...
// 校验图片验证码
easyCaptchaService.verifyCaptchaCode(uuid,captchaCode);
...复制







文章转载自猿码记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家观点】罗敏:从理论到真实SQL,感受DeepSeek如何做性能优化
墨天轮编辑部
1239次阅读
2025-03-06 16:45:38
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1219次阅读
2025-03-13 11:40:53
2025年2月国产数据库大事记
墨天轮编辑部
956次阅读
2025-03-05 12:27:34
2025年2月国产数据库中标情况一览:GoldenDB 3500+万!达梦近千万!
通讯员
849次阅读
2025-03-06 11:40:20
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
439次阅读
2025-03-13 14:38:19
AI的优化能力,取决于你问问题的能力!
潇湘秦
408次阅读
2025-03-11 11:18:22
优炫数据库成功应用于国家电投集团青海海南州新能源电厂!
优炫软件
335次阅读
2025-03-21 10:34:08
达梦数据与法本信息签署战略合作协议
达梦数据
280次阅读
2025-03-06 09:26:57
国产化+性能王炸!这套国产方案让 3.5T 数据 5 小时“无感搬家”
YMatrix
267次阅读
2025-03-13 09:51:26
IBM收购数据库厂商DataStax:瞄准向量和AI搜索
深度数据云
259次阅读
2025-02-28 12:04:04