首页 > 编程语言 >java生成图片验证码

java生成图片验证码

时间:2022-11-18 00:11:08浏览次数:37  
标签:200 lineCaptcha java CaptchaUtil 验证码 生成 100 response

引入依赖

	<!-- 添加图形验证码依赖 -->
        <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");
}

执行后可以在指定位置看到验证码图片了,非常简单
image
此外,我们还可以将验证码通过Servlet输出到浏览器

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

使用postman发送请求,可以看到验证码成功返回
image
CaptchaUtil还可以创建各种样式的验证码:

圆形干扰验证码:

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

image
扭曲干扰验证码:

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

image
GIF验证码:

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

image

二、校验验证码

校验我们会用到ICaptcha的getCode()方法和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()));	
	}

输出结果:
image
但是我一般不会用到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();
    }

image

四则运算验证码:

	@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();
    }

image

标签:200,lineCaptcha,java,CaptchaUtil,验证码,生成,100,response
From: https://www.cnblogs.com/guozhiqiang/p/16901874.html

相关文章

  • Java——包装类详解
                 装箱与拆箱的概念.基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:装箱:从基本类型转换为对应的包装......
  • Java Object类详解
    Object是 Java 类库中的一个特殊类,也是所有类的父类。也就是说,Java允许把任何类型的对象赋给Object类型的变量。当一个类被定义后,如果没有指定继承的父类,那么默认父......
  • 【书籍分享】Java 从入门到精通 第5版 明日科技 高清文字版pdf 下载
    自取:https://url03.ctfile.com/f/24333903-727283519-6e30ef?p=5831【访问密码:5831】,进入下载页面,选择【普通下载】......
  • java——API——StringBuilder类
    StringBuilder类的概述查阅java.lang.StringBuilder的API,StringBuilder又称为可变字符序列,它是一个类似于String的字符串缓冲区,通过某些方法调用可以改变该序列的长......
  • Java:SpringBoot整合hibernate-validator实现入参数据校验
    本文仅实现了api接口基本的参数校验,还有更多的校验场景,可以参考文章底部的参考链接使用starter创建SpringBoot项目,并添加依赖依赖<properties><java.version>1.8<......
  • 用 Java 的 IO 流进行读写文件操作
    前言在计算机领域里IO,有时也写作​​I/O​​,是​​Input/Output​​的缩写,也就是输入和输出。这里的输入和输出是指不同系统之间的数据输入和输出,比如读写文件数据,读写......
  • java——API—— System类
    System类的概述与使用java.lang.System类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作,在System类的API文档中,常用的方法有:publicstaticlongcurren......
  • javascript-代码随想录训练营day2
    59.螺旋矩阵Ⅱ题目链接:https://leetcode.cn/problems/spiral-matrix-ii/题目描述:给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn......
  • java——API—— Date类
                        Date类的构造方法和成员方法:                      ......
  • JavaScript对象-RegExp1、RegExp2
    JavaScript对象-RegExp1 RegExp:正则表达式对象1、正则表达式:定义字符串的组成规则1.单个字符:[]如:[a][ab][a-zA-Z][0-9_]特殊符号代表特殊含义的单个字符:\ld:......