简介
Hutool是一个便捷而又全面的Java工具类库,通过封装静态方法,降低学习API的成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自每个用户的不断完善,它涵盖了Java底层代码中的每个方面,既是大型项目开发中解决小问题的利器,也是小型项目中的有利助手;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
一、效果展示
1.1 扭曲干扰验证码
1.2 线条干扰验证码
1.3 圆圈干扰验证码
二、验证码应用场景
以下是验证码的主要应用场景:
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;
}
}
-
利用@Autowired注解注入一个CaptchaProperties对象,这个对象将用来配置图形验证码的属性的。这是因为代码中一些属性可能会在别处使用,且它们都是固定的,例如图形验证码的长和宽,Session的字段名等。将这些属性封装在一个对象中,并通过读取配置文件的方式绑定属性值。
-
在@RequestMapping注解的getCaptcha方法中,使用Hutool包的CaptchaUtil.createLineCaptcha方法创建了一个图形验证码对象lineCaptcha,其大小由配置文件中的captchaProp.getWidth()和captchaProp.getHeight()决定。然后,将验证码内容和当前时间戳存储到HttpSession中,以便后续校验验证码的时候使用。最后,将图形验证码写出到HttpServletResponse的输出流中,以返回给前端页面显示。
-
在@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 显示验证码图片如下:
总结:
感谢观看,希望该文章能够帮助到您提升知识和技能。如果您喜欢我的内容,请不要忘记点赞和分享哦!👍
原文始发于微信公众号(Java技术前沿):SpringBoot实战:使用Hutool工具类轻松生成验证码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/299617.html