Java实现生成和校验图片验证码(详细)

验证码校验是日常中很常见的场景,工作中难免会遇到了生成和校验验证码这样的需求,下面我们就来用java实现它

验证码生成和校验我用到了Hutool工具类,我们先引入他的依赖

	<!-- 添加图形验证码依赖 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-captcha</artifactId>
            <version>5.8.6</version>
        </dependency>

hutool生成图片验证码的核心接口是ICaptcha,此接口定义了以下方法:

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

AbstractCaptcha为一个ICaptcha抽象实现类,此类实现了验证码文本生成、非大小写敏感的验证、写出到流和文件等方法,通过继承此抽象类只需实现createImage方法定义图形生成规则即可。

一、生成随机验证码

创建一个Demo,将验证码生成到本地

	public static void main(String[] args) {
        // 定义图形验证码的长和宽
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
        // 图形验证码写出到指定文件
        lineCaptcha.write("F:/test/captcha.png");
    }

执行后可以在指定位置看到验证码图片了,非常简单
在这里插入图片描述

此外,我们还可以将验证码通过Servlet输出到浏览器

	@GetMapping
    public void createCaptcha(HttpServletResponse response) throws IOException {
        // 定义图形验证码的长和宽
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
        // 图形验证码写出,可以写出到文件,也可以写出到流
        lineCaptcha.write(response.getOutputStream());
        // 关闭流
        response.getOutputStream().close();
    }

使用postman发送请求,可以看到验证码成功返回
在这里插入图片描述

CaptchaUtil还可以创建各种样式的验证码:

圆形干扰验证码:

// 定义图形验证码的长、宽、验证码字符数、干扰元素个数
CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 30);

在这里插入图片描述

扭曲干扰验证码:

// 定义图形验证码的长、宽、验证码字符数、干扰线宽度
ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);

在这里插入图片描述

GIF验证码:

// 定义GIF验证码的长、宽
GifCaptcha captcha = CaptchaUtil.createGifCaptcha(200, 100);

在这里插入图片描述

二、校验验证码

校验我们会用到ICaptchagetCode()方法和verify(),生成图片验证码之后

	public static void main(String[] args) {
        // 定义图形验证码的长和宽
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
        // 图形验证码写出到文件
        lineCaptcha.write("F:/test/captcha.png");
        // getCode()可以获取到验证码的值
        System.out.println(lineCaptcha.getCode());
        // verify()验证图形验证码的有效性,返回boolean值
        System.out.println(lineCaptcha.verify("ABCD"));
		System.out.println(lineCaptcha.verify(lineCaptcha.getCode()));	
	}

输出结果:
在这里插入图片描述

但是我一般不会用到verify()方法,我的逻辑是生成验证码的时候通过getCode()获取到他的code存入redis中,然后来校验

三、自定义格式验证码

有时候普通的验证码不满足要求,比如我们希望使用纯数字、加减乘除的验证码,此时我们就可以自定义他的格式

纯数字的验证码:

	@GetMapping
    public void createCaptcha(HttpServletResponse response) throws IOException {
        // 随机4位数字,可重复
        RandomGenerator randomGenerator = new RandomGenerator("0123456789", 4);
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
        lineCaptcha.setGenerator(randomGenerator);
        // 重新生成code
        lineCaptcha.createCode();
        lineCaptcha.write(response.getOutputStream());
        // 关闭流
        response.getOutputStream().close();
    }

在这里插入图片描述

四则运算验证码:

	@GetMapping
    public void createCaptcha(HttpServletResponse response) throws IOException {
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
        // 自定义验证码内容为四则运算方式
        lineCaptcha.setGenerator(new MathGenerator());
        // 重新生成code
        lineCaptcha.createCode();
        // 重新生成code
        lineCaptcha.createCode();
        lineCaptcha.write(response.getOutputStream());
        // 关闭流
        response.getOutputStream().close();
    }

在这里插入图片描述
至此,生成验证码就演示完了,如果这篇文章帮助到你,那就点个赞吧~

  • 22
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

UnIQUE Eason

最喜欢你一言不合就打赏的样子了

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

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

打赏作者

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

抵扣说明:

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

余额充值