SpringBoot实战:使用Hutool工具类轻松生成验证码

简介

Hutool是一个便捷而又全面的Java工具类库,通过封装静态方法,降低学习API的成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。


Hutool中的工具方法来自每个用户的不断完善,它涵盖了Java底层代码中的每个方面,既是大型项目开发中解决小问题的利器,也是小型项目中的有利助手;


Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。


一、效果展示

话不多说,先来看看效果图 

1.1 扭曲干扰验证码

SpringBoot实战:使用Hutool工具类轻松生成验证码

1.2 线条干扰验证码

SpringBoot实战:使用Hutool工具类轻松生成验证码

1.3 圆圈干扰验证码

SpringBoot实战:使用Hutool工具类轻松生成验证码


二、验证码应用场景

以下是验证码的主要应用场景:

1. 用户注册与身份验证

  • 网站与APP注册:在注册新用户时,要求用户输入手机号码并接收短信验证码,以确保注册信息的真实性和有效性,防止恶意注册和垃圾注册。这有助于维护平台的用户质量和安全。

  • 身份验证:除了注册外,用户在进行敏感操作(如修改密码、绑定第三方账号等)时,也需要输入短信验证码进行身份验证,确保操作的安全性。

2. 支付验证

  • 大额支付:在进行大额支付或转账时,系统通常会要求用户输入短信验证码以确认支付意愿和身份,从而保护用户的资金安全。

  • 快捷支付:一些快捷支付服务也会使用短信验证码进行二次验证,以提高支付过程的安全性。

3. 订单与物流通知

  • 订单确认:在电商平台购物后,用户会收到包含订单信息的短信验证码,以确认订单的有效性和真实性。

  • 物流通知:物流公司会通过短信验证码向用户发送订单发货、配送中、已签收等物流信息,提高物流服务的透明度和用户满意度。

4. 信息安全与隐私保护

  • 密码找回:当用户忘记密码时,可以通过注册时填写的手机号码接收短信验证码来重置密码,保护用户的账号安全。

  • 动态密码:在一些需要高安全性的场景下(如游戏网站、银行系统等),可以使用动态密码(即短信验证码)进行登录或操作验证,提高系统的安全性。

5. 通知与提醒

  • 活动通知:企业可以通过短信验证码向用户发送活动通知、优惠信息等,提高用户参与度和品牌曝光度。

  • 重要信息提醒:如银行账户变动提醒、社保缴纳提醒等,通过短信验证码及时通知用户重要信息的变化。

6. 其他应用场景

  • 银行交易验证:在网上银行、手机银行等渠道进行转账、汇款等交易时,通常需要输入短信验证码进行验证。

  • 政务服务:在办理政务服务时(如税务申报、社保查询等),用户可能需要输入短信验证码以确认身份和操作意愿。

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

3.1 引入依赖

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

3.2 核心代码

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hxxy.captchademo.config.CaptchaProperties;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.io.IOException;
import java.util.Date;
 
@RestController
@RequestMapping("/captcha")
public class CaptchaController {
 
    @Autowired
    private CaptchaProperties captchaProp;
 
    @RequestMapping("/get")
    public void getCaptcha(HttpServletResponse response, HttpSession session) {
        //定义图形验证码的长和宽(配置默认值)
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProp.getWidth(), captchaProp.getHeight());
        //细节问题,不影响程序
        //设置返回类型
        response.setContentType("image/jpeg");
        //静止缓存
        response.setHeader("Progma", "No-cache");
        try {
            //图形验证码写出,可以写出到文件,也可以写出到流
            lineCaptcha.write(response.getOutputStream());
            //同时将验证码内容和当前时间戳存储到Session中
            //此处Session的键可以配置成常量
            session.setAttribute(captchaProp.getSession().getKey(), lineCaptcha.getCode());
            session.setAttribute(captchaProp.getSession().getDate(), new Date());
            //关流
            response.getOutputStream().close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
 
    //验证码生效时间限制
    private static final long VALID_MILLIS_TIME = 60 * 1000;
 
    @RequestMapping("/check")
    public boolean checkCaptcha(String captcha, HttpSession session) {
        //保证传过来的参数是合法的
        if (StringUtils.hasLength(captcha)) {
            //根据配置的默认session信息获取key和date
            String key = (String) session.getAttribute(captchaProp.getSession().getKey());
            Date date = (Date) session.getAttribute(captchaProp.getSession().getDate());
            //1.验证码正确(不区分大小写) 2.验证码还未失效
            return key.equalsIgnoreCase(captcha)
                    && System.currentTimeMillis() - date.getTime() < VALID_MILLIS_TIME;
        }
        return false;
    }
}
  1. 利用@Autowired注解注入一个CaptchaProperties对象,这个对象将用来配置图形验证码的属性的。这是因为代码中一些属性可能会在别处使用,且它们都是固定的,例如图形验证码的长和宽,Session的字段名等。将这些属性封装在一个对象中,并通过读取配置文件的方式绑定属性值。

  2. 在@RequestMapping注解的getCaptcha方法中,使用Hutool包的CaptchaUtil.createLineCaptcha方法创建了一个图形验证码对象lineCaptcha,其大小由配置文件中的captchaProp.getWidth()和captchaProp.getHeight()决定。然后,将验证码内容和当前时间戳存储到HttpSession中,以便后续校验验证码的时候使用。最后,将图形验证码写出到HttpServletResponse的输出流中,以返回给前端页面显示。

  3. 在@RequestMapping注解的checkCaptcha方法中,首先判断传入的验证码参数是否合法。如果合法,则从HttpSession中获取存储的验证码内容和时间戳信息,并进行比较。如果验证码正确且未过期,则返回true,否则返回false。


3..3  CaptchaProperties类的实现和配置文件(.yml)信息如下:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
 
@Data
@Configuration
@ConfigurationProperties(prefix = "captcha")
public class CaptchaProperties {
    private Integer width;
    private Integer height;
    private Session session; //使用自定义的Session类
 
    @Data
    public static class Session {
        private String key;
        private String date;
    }
}
spring:
  application:
    name:
      captcha-demo
 
captcha:
  width: 200
  height: 100
  session:
    key: CAPTCHA_SESSION_KEY
    date: CAPTCHA_SESSION_DATE

启动项目,再访问 http://127.0.0.1:8080/captcha/get 显示验证码图片如下:

SpringBoot实战:使用Hutool工具类轻松生成验证码

总结:

感谢观看,希望该文章能够帮助到您提升知识和技能。如果您喜欢我的内容,请不要忘记点赞和分享哦!👍

原文始发于微信公众号(Java技术前沿):SpringBoot实战:使用Hutool工具类轻松生成验证码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/299617.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!