Java使用Hutool工具类轻松生成验证码

一、效果展示:

1.1 扭曲干扰的验证码

1.2 线条干扰的验证码

1.3 圆圈干扰的验证码

二、Hutool工具类实现验证码生成

引入依赖

<!--hutool工具包-->
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.7.15</version>
</dependency>

核心代码

@Slf4j
@RestController
@RequestMapping("/verify/code")
public class VerifyCodeController {

    //获取扭曲干扰的验证码
    @GetMapping("/createShearCaptcha")
    public void getShearCaptcha(HttpServletResponse response)
    {

        //定义图形验证码的长、宽、验证码字符数、干扰线宽度
        ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 50,4,3);
        //设置背景颜色
        shearCaptcha.setBackground(new Color(249, 251, 220));
        //生成四位验证码
        String code = RandomUtil.randomNumbers(4);
        //生成验证码图片
        Image image = shearCaptcha.createImage(code);
        //返回验证码信息
        responseCode(response, code, image);
    }

    //获取线条干扰的验证码
    @GetMapping("/createLineCaptcha")
    public void getLineCaptcha(HttpServletResponse response)
    {

        //定义图形验证码的长、宽、验证码位数、干扰线数量
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 50,4,80);
        //设置背景颜色
        lineCaptcha.setBackground(new Color(249, 251, 220));
        //生成四位验证码
        String code = RandomUtil.randomNumbers(4);
        Image image = lineCaptcha.createImage(code);
        //返回验证码信息
        responseCode(response, code, image);
    }

    //获取圆圈干扰的验证码
    @GetMapping("/createCircleCaptcha")
    public void getCircleCaptcha(HttpServletResponse response)
    {

        //定义图形验证码的长、宽、验证码位数、干扰圈圈数量
        CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(150, 50,4,30);
        //设置背景颜色
        circleCaptcha.setBackground(new Color(249, 251, 220));
        //生成四位验证码
        String code = RandomUtil.randomNumbers(4);
        Image image = circleCaptcha.createImage(code);
        //返回验证码信息
        responseCode(response, code, image);
    }




    private static void responseCode(HttpServletResponse response, String code, Image image) {
        response.setContentType("image/jpeg");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        String uuidStr = UUID.randomUUID().toString().replace("-", "");
        log.info("生成验证码 uuidStr:{} ,code:{}",uuidStr, code);
        response.setHeader("verifyCodeUuid",uuidStr);
        try {
            BufferedImage bufferedImage = toBufferedImage(image);
            // 创建一个ByteArrayOutputStream,用于存储图片数据
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // 写入图片数据到ByteArrayOutputStream
            ImageIO.write(bufferedImage, "jpeg", baos);
            // 将ByteArrayOutputStream转换为ByteArrayInputStream
            byte[] imageInBytes = baos.toByteArray();
            //输出
            IoUtil.write(response.getOutputStream(), true, imageInBytes);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里响应的时候,我在请求头中加了个verifyCodeUuid (验证码唯一标识), 是用于后续 校验验证码使用的,可以将验证码存在redis ,存储的key的话可以使用 【前缀+请求ip+verifyCodeUuid 】 形式来进行存储,后续获取校验的时候也是一样的key,前端就需要将verifyCodeUuid 和用户输入的验证码一并传过来。这是一种简单的实现,具体 实现还需看具体业务,这里供参考。

最简单实现方式

 @GetMapping("/createShearCaptchaV2")
    public void getShearCaptchaV2(HttpServletResponse response)
    {
        //定义图形验证码的长、宽、验证码字符数、干扰线宽度
        ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 50,4,3);
        response.setContentType("image/jpeg");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        String uuidStr = UUID.randomUUID().toString().replace("-", "");
        log.info("生成验证码 uuidStr:{} ,code:{}",uuidStr, shearCaptcha.getCode());
        response.setHeader("verifyCodeUuid",uuidStr);
        try {
            //输出
            shearCaptcha.write(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

这里使用了默认的样式,背景色为白色。

参考:

1、https://zhuanlan.zhihu.com/p/700437085

可以使用Hutool验证码工具类生成验证码,并将其展示在页面上,然后使用axios将用户输入的验证码发送给后端进行验证。 以下是一个示例代码: 前端部分: ```html <!-- 展示验证码 --> <img id="captchaImg" src="/captcha"> <!-- 输入框 --> <input type="text" id="captchaInput"> <!-- 验证按钮 --> <button onclick="verify()">验证</button> ``` ```javascript function verify() { const captcha = document.getElementById('captchaInput').value; axios.post('/verifyCaptcha', { captcha }).then(response => { if (response.data.success) { // 验证成功 } else { // 验证失败 } }); } ``` 后端部分: ```java // 生成验证码 String captcha = CaptchaUtil.createLineCaptcha(200, 100, 4, 150).getCode(); // 将验证码存储到session中 request.getSession().setAttribute("captcha", captcha); // 验证验证码 String inputCaptcha = request.getParameter("captcha"); String sessionCaptcha = (String) request.getSession().getAttribute("captcha"); boolean success = inputCaptcha.equalsIgnoreCase(sessionCaptcha); ``` 在上面的示例代码中,前端展示了一个验证码图片,并提供了一个输入框和一个验证按钮。当用户点击验证按钮时,通过axios将用户输入的验证码发送到后端进行验证。后端使用Hutool验证码工具类生成验证码,并将其存储到session中。当用户输入验证码并点击验证按钮时,后端将用户输入的验证码与session中的验证码进行比较,判断验证码是否正确。最后,后端将验证结果返回给前端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值