SpringBoot实战:验证码登录Captcha简单粗暴(附git源码)



简介

  • 本教程利用hutool工具包简单粗暴的实现验证码登录,验证码功能位于cn.hutool.captcha包中,核心接口为ICaptcha,此接口定义了以下方法:

    createCode 创建验证码,实现类需同时生成随机验证码字符串和验证码图片
    getCode 获取验证码的文字内容
    verify 验证验证码是否正确,建议忽略大小写
    write 将验证码写出到目标流中

  • 支持前后端分离

  • 支持自定义验证码

  • 支持运算验证码

1. 依赖

  • pom.xml
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--     hutool工具包  -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.0</version>
        </dependency>

2. 封装验证码工具类

  • CaptchaUtils
/**
 * 生成及校验图片验证码
 *
 * @author ding
 */
public class CaptchaUtils {

    /**
     * 模拟redis存储验证码,生成环境建议使用redis存储验证码,设置一个有效期,如5分钟
     */
    private static final HashMap<String, String> CODE_MAP = new LinkedHashMap<>();

    /**
     * CircleCaptcha 圆圈干扰验证码
     * (200, 100, 5, 20)定义图形验证码的长、宽、验证码字符数、干扰元素个数
     *
     * @param uuid     由web端生成一个随机uuid,登录时需将uuid和验证码一起提交,前后端分离时,可通过uuid确认验证码来源
     * @param response 响应体
     */
    public static void getCircleCaptcha(String uuid, HttpServletResponse response) throws IOException {
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100, 5, 20);
        CODE_MAP.put(uuid, lineCaptcha.getCode());
        writeResp(lineCaptcha, response);
    }

    /**
     * ShearCaptcha 扭曲干扰验证码
     * (200, 100, 4, 4)定义图形验证码的长、宽、验证码字符数、干扰线宽度
     *
     * @param uuid     由web端生成一个随机uuid,登录时需将uuid和验证码一起提交,前后端分离时,可通过uuid确认验证码来源
     * @param response 响应体
     */
    public static void getShearCaptcha(String uuid, HttpServletResponse response) throws IOException {
        ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
        CODE_MAP.put(uuid, captcha.getCode());
        writeResp(captcha, response);
    }


    /**
     * 自定义验证码
     * 加减验证码
     *
     * @param uuid     由web端生成一个随机uuid,登录时需将uuid和验证码一起提交,前后端分离时,可通过uuid确认验证码来源
     * @param response 响应体
     */
    public  static void getMathShearCaptcha(String uuid, HttpServletResponse response) throws IOException {
        ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 45, 4, 4);
        // 自定义验证码内容为四则运算方式
        captcha.setGenerator(new MathGenerator());
        CODE_MAP.put(uuid, captcha.getCode());
        writeResp(captcha, response);
    }

    /**
     * 验证码校验
     *
     * @param uuid 获取验证码时提交的uuid
     * @param code 验证码
     */
    public static  boolean verify(String uuid, String code) {
        boolean b = Optional
                .ofNullable(CODE_MAP.get(uuid))
                .stream()
                .anyMatch(c -> c.equals(code));
        if (b) {
            CODE_MAP.remove(uuid);
        }
        return b;
    }

    /**
     * http图片响应
     */
    private  static void writeResp(AbstractCaptcha abstractCaptcha, HttpServletResponse response) throws IOException {
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
            abstractCaptcha.write(out);
        } finally {
            if (Objects.nonNull(out)) {
                out.close();
            }
        }
    }

}
  • 这里测试用了map存储验证码,生产环境换成redis即可
  • 之所以由web端生成一个随机uuid,是因为在前后端分离时,是无法使用session的,为了确保来源需前端主动发送一个标识码过来,第二步登录时可通过uuid确认验证码来源。

3. 实战

  • 编写测试接口
  • IndexController
/**
 * @author ding
 */
@RestController
public class IndexController {
    /**
     * 获取验证码
     */
    @GetMapping("/getCaptcha")
    public void getCaptcha(String uuid, HttpServletResponse response) throws IOException {
        CaptchaUtils.getCircleCaptcha(uuid, response);
    }

    /**
     * 模拟登录校验
     */
    @GetMapping("/login")
    public boolean login(String uuid, String code, String username, String password) {
        return CaptchaUtils.verify(uuid, code);
    }
}
  • 这里使用postman测试,也可直接浏览器测试
  • 第一步获取验证码,参数uuid输入任意即可,生成环境下web端需保证uuid的随机性
    在这里插入图片描述
  • 第二步模拟登录 参数uuid需和第一步的uuid保持一致
    在这里插入图片描述

6. 源码分享

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Happy Captcha简易验证码是一款易于使用的Java验证码软件包,旨在花最短的时间,最少的代码量,实现Web站点的验证码功能。 Happy Captcha简易验证码提供了图片和动画两种展现形式,验证码内容包括中文(收录3500个常用汉字),阿拉伯数字(09),中文数字(零至九),中文大写数字(零至玖),数字与字母混合(09-az-AZ),数字与小写字母混合(09-az),数字与大写字母混合(09-AZ),纯小写字母,纯大写字母,大小写字母混合以及运算表达式(阿拉伯数字运算表达式和中文运算表达式)等12种型。 Happy Captcha简易验证码完全遵循Apache 2.0开源许可协议,你可以自由使用该软件,如您在使用Happy Captcha时发现软件的任何缺陷,欢迎随时与作者联系。 Happy Captcha简易验证码安装: 如果你的项目使用的是Maven进行依赖管理,你只向pom.xml文件添加下面的配置即可:     com.ramostear   Happy-Captcha   1.0.1   Gradle用户则可以通过引入如下的配置获取Happy Captcha: implementation 'com.ramostear:Happy-Captcha:1.0.1' Happy Captcha简易验证码使用: HappyCaptcha在设计时力求过程的简洁,在默认情况下,你只要书写一行代码即可生成漂亮的验证码图片。下面是HappyCaptcha的使用示例: @Controller public class HappyCaptchaController{     @GetMapping("/captcha")     public void happyCaptcha(HttpServletRequest request,HttpServletResponse response){         HappyCaptcha.require(request,response).build().finish();     } } 对于HappyCaptcha而言,只有request和response是必须提供的参数,其余参数都可以使用缺省值。 在默认情况下,HappyCaptcha生成的验证码图片形式展现,内容为09-az-A~Z的字符随机组合,字符长度为5,图片宽度为160,高度为50,字体为微软雅黑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小定

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值