首页 > 编程语言 >【Java】EasyCaptcha 封装验证码接口

【Java】EasyCaptcha 封装验证码接口

时间:2022-11-25 23:44:07浏览次数:41  
标签:Java String 验证码 private param EasyCaptcha import final

 

依赖坐标:

        <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.spring.SpringContextHolder;
import cn.cloud9.server.struct.util.IpUtil;
import cn.cloud9.server.test.model.CaptchaParam;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import com.wf.captcha.utils.CaptchaUtil;
import org.apache.commons.lang3.StringUtils;
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.nio.charset.StandardCharsets;
import java.util.Locale;
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();

    @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.getOutputStream().write(base64.getBytes());
        } else {
            /* 设置请求头为输出图片类型 */
            response.setContentType("image/gif");
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);

            /* 输出验证码图片 */
            specCaptcha.out(response.getOutputStream());
        }
    }

    /**
     *
     * @param verifyCode
     * @param useRedis
     * @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

 

标签:Java,String,验证码,private,param,EasyCaptcha,import,final
From: https://www.cnblogs.com/mindzone/p/16926687.html

相关文章

  • JAXB 实现java对象与xml之间互相转换
    首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用:1.@XmlRootElement,用于类级别的注解,对应xml的跟元素。通过name属性定义这个根节点的名称。2.@XmlAccessorType,定......
  • 利用java-springboot和paddleocr进行ocr识别
    利用java-springboot和paddleocr进行ocr识别项目:https://github.com/jiangnanboy/java-springboot-paddleocrTableofContentsAboutGettingStartedResultContactR......
  • 用C#生成随机中文汉字验证码的基本原理
    1、汉字编码原理到底怎么办到随机生成汉字的呢?汉字从哪里来的呢?是不是有个后台数据表,其中存放了所需要的所有汉字,使用程序随机取出几个汉字组合就行了呢?使用后台数据库先将......
  • Java基本数据类型
    Java基本数据类型1.整型byte占1字节空间,取值范围-2^7~(2^7)-1,二进制首位为符号位,二进制表示0_000_0000~1_111_1111,1_000_0000记为-128。/***Aconstant......
  • 记一次java四舍五入错误结果的问题
    1.背景在进行除法计算时,结果不符合预期2.测试过程double精度问题,导致四舍五入结果误差BigDecimalb1=newBigDecimal(0.245);BigDecimalb2=new......
  • JAVA数据类型拓展
    数据类型拓展,基础面试题讲解整数//整数拓展进制二进制0b十进制八进制0十六进制0xinti=10;inti2=0b10;inti3=010;......
  • ACM 模式下的Java
    一、引入包相关importjava.util.*;二、基本输入相关涉及到输入需要提前创建一个键盘接收器Scannercin=newScaner(System.in);1、输入一个基本数据结构按照by......
  • Java SPI 机制浅析
    本文通过探析JDK提供的,在开源项目中比较常用的JavaSPI机制,希望给大家在实际开发实践、学习开源项目提供参考。一、SPI是什么SPI全称ServiceProviderInterface,......
  • Java 数组拷贝的几种方式
    目前在Java中数据拷贝提供了如下方式:1、clone2、System.arraycopy3、Arrays.copyOf4、Arrays.copyOfRange。一、clone方法clone方法是从Object类继承过来的,基本数据......
  • Java 序列化工具
    一、Java自带的序列化Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据......