关于Hutool的模块使用说明方法

在这里插入图片描述

Hutool包含多个模块,每个模块针对特定的功能需求提供支持:

• hutool-aop:JDK动态代理封装,为非IOC环境提供切面支持。

• hutool-bloomFilter:布隆过滤器,提供基于Hash算法的实现。

• hutool-cache:简单的缓存实现。

• hutool-core:核心模块,包含Bean操作、日期处理等多种工具。

• hutool-cron:定时任务模块,支持类似Crontab的表达式。

• hutool-crypto:加密解密模块,封装了对称、非对称及摘要算法。

• hutool-db:基于JDBC的数据操作封装,采用ActiveRecord思想。

• hutool-dfa:基于DFA模型的多关键字查找。

• hutool-extra:扩展模块,封装第三方服务如模板引擎、邮件、Servlet等。

• hutool-http:基于HttpUrlConnectionHttpClient封装。

• hutool-log:自动识别日志实现的日志门面。

• hutool-script:脚本执行封装,如Javascript。

• hutool-setting:功能强大的配置文件和Properties封装。

• hutool-system:系统参数调用封装,如JVM信息。

• hutool-json:JSON实现。

• hutool-captcha:图片验证码实现。

• hutool-poi:针对POIExcelWord封装。

• hutool-socket:基于Java NIOAIOSocket封装。

• hutool-jwt:JSON Web TokenJWT)封装。

可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块。

Hutool的使用,在Maven项目中,可以通过添加以下依赖来引入Hutool:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.28</version>
</dependency>

HTTP请求示例
Hutool简化了HTTP请求的处理,以下是发送GET和POST请求的示例:

public static void main(String[] args) {
 	// GET请求示例
     String content = HttpUtil.get("https://www.example.com/api/data");

     // POST请求示例
     HashMap<String, Object> param = new HashMap<>();
     param.put("city", "重庆");
     String result = HttpUtil.post("https://www.example.com/api/post", param);

     System.out.println("GET请求返回:" + content);
     System.out.println("POST请求返回:" + result);
}

随机验证码生成方法

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.captcha.generator.RandomGenerator;
import cn.hutool.crypto.SecureUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
/**
 * 系统基础信息--图片验证码管理模块
 * @author weimeilayer@gmail.com
 * @date 2021年3月17日 图片验证码(支持算术形式)
 */
@CrossOrigin
@RestController
@AllArgsConstructor
@RequestMapping("/code")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
@Tag(description = "图片验证码模块操作接口", name = "图片验证码模块操作接口")
public class SysCaptchaController {
	/**
	 * 宽
	 */
	private final Integer WIDTH = 120;
	/**
	 * 高
	 */
	private final Integer HEIGHT = 40;
	/**
	 * 编码长度
	 */
	private final Integer CODE_COUNT = 4;
	/**
	 * 干扰线数
	 */
	private final Integer LINE_COUNT = 20;
	/**
	 * 验证码长度
	 */
	private final Integer CODE_SIZE = 4;
	/**
	 * RedisTemplate
	 */
	private final RedisTemplate redisTemplate;
	/**
	 * 验证码有效期
	 */
	private final Integer CODE_TIME = 60;
	/**
	 * 验证码前缀
	 */
	private final String DEFAULT_CODE_KEY = "DEFAULT_CODE_KEY:";
	/**
	 * 验证码
	 * 
	 * @param key
	 * @return
	 */
	@Operation(summary = "生成字节流验证码")
	@GetMapping(value = "/captcha/{key}")
	public R randomImage(@PathVariable String key) {
		// 第一种:验证码纯数字化
		RandomGenerator randomGenerator = new RandomGenerator("0123456789", CODE_SIZE );
		LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(WIDTH, HEIGHT, CODE_COUNT, LINE_COUNT);
		// 调用父类的 setGenerator() 方法,设置验证码的类型
		lineCaptcha.setGenerator(randomGenerator);
		String code = lineCaptcha.getCode();
		String realKey = SecureUtil.md5(code + key);
		redisTemplate.opsForValue().set(DEFAULT_CODE_KEY  + realKey, code, CODE_TIME,TimeUnit.SECONDS);
		Map<String, String> res = new HashMap<>(2);
		res.put("realKey", realKey);
		res.put("img", lineCaptcha.getImageBase64Data());
		//第二种:验证码含字母
        /*LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(WIDTH, HEIGHT, CODE_COUNT, LINE_COUNT);
        String code = lineCaptcha.getCode();
        String realKey = SecureUtil.md5(code + key);
        if (GlobalConfig.isRedisSwitch()) {
            redisTemplate.opsForValue().set(DEFAULT_CODE_KEY   + realKey, code, CODE_TIME, TimeUnit.SECONDS);
        }
        Map<String, String> res = new HashMap<>(2);
        res.put("realKey", realKey);
        res.put("img", lineCaptcha.getImageBase64());*/
		return R.ok(res);
	}

拼音工具

导入
import cn.hutool.extra.pinyin.PinyinUtil;

// 获取全部拼音 输出结果:ni hao
String pinyin = PinyinUtil.getPinyin("你好", " ");
// 获取拼音首字母 输出结果:h s d y g
String result = PinyinUtil.getFirstLetter("H是第一个", ", ");

数字处理工具,包括保留小数、时间格式化、校验数字和生成随机数

import cn.hutool.core.lang.Console;
import cn.hutool.core.util.NumberUtil;

/**
 * @author weimeilayer@gmail.com ✨
 * @date 💓💕 2023年5月20日 🐬🐇 💓💕
 */
public class NumberUtilExample {

     public static void main(String[] args) {
	 	double number1 = 1234.56789;
        double number2 = 9876.54321;
        // 保留小数点后两位,并以字符串形式返回
        String rounded1 = NumberUtil.roundStr(number1, 2);
        String rounded2 = NumberUtil.roundStr(number2, 2);

        Console.log("保留小数点后两位:");
        Console.log(rounded1); // 输出: 1234.57
        Console.log(rounded2); // 输出: 9876.54

        // 保留小数点后四位,并返回double类型
        BigDecimal rounded3 = NumberUtil.round(number1, 4);
        BigDecimal rounded4 = NumberUtil.round(number2, 4);

        Console.log("保留小数点后四位:");
        Console.log(rounded3); // 输出: 1234.5679
        Console.log(rounded4); // 输出: 9876.5432
	}
}

数据脱敏
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.DesensitizedUtil;

/**
 * @author weimeilayer@gmail.com ✨
 * @date 💓💕 2024年3月5日 🐬🐇 💓💕
 */
 public class DesensitizedUtilExample {
 	public static void main(String[] args) {
        // 身份证号脱敏
        String idCard = "222222202205201314";
        String desensitizedIdCard = DesensitizedUtil.idCardNum(idCard, 1, 2);
        Console.log("原始身份证号: " + idCard);
        Console.log("脱敏后身份证号: " + desensitizedIdCard); // 输出: 2***************14
        
        // 手机号脱敏
        String phoneNumber = "13800001314";
        String desensitizedPhone = DesensitizedUtil.mobilePhone(phoneNumber);
        Console.log("原始手机号: " + phoneNumber);
        Console.log("脱敏后手机号: " + desensitizedPhone); // 输出: 138****1314

        // 密码脱敏
        String password = "1234567890";
        String desensitizedPassword = DesensitizedUtil.password(password);
        Console.log("原始密码: " + password);
        Console.log("脱敏后密码: " + desensitizedPassword); // 输出: **********
    }
}

布隆过滤器

import cn.hutool.bloomfilter.BitMapBloomFilter;
import cn.hutool.core.lang.Console;

/**
 * @author weimeilayer@gmail.com ✨
 * @date 💓💕 2024年3月5日 🐬🐇 💓💕
 */
public class BloomFilterExample {
    public static void main(String[] args) {
        // 初始化布隆过滤器,预期容量为5个城市名
        BitMapBloomFilter filter = new BitMapBloomFilter(5);
        // 添加城市名
        filter.add("北京");
        filter.add("上海");
        filter.add("广州");
        // 查找城市名
        boolean exists1 = filter.contains("北京");
        boolean exists2 = filter.contains("深圳");
        Console.log("布隆过滤器测试:");
        Console.log("是否存在 '北京': " + exists1); // 输出: true
        Console.log("是否存在 '深圳': " + exists2); // 输出: false
    }
}

Hutool的MailUtil简化了邮件发送过程,以下是发送邮件的示例

import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;

/**
 * @author weimeilayer@gmail.com ✨
 * @date 💓💕 2024年3月5日 🐬🐇 💓💕
 */
public class MailUtilExample {
    public static void main(String[] args) {
        // 发件人邮箱配置
        MailAccount mailAccount = new MailAccount();
        mailAccount.setHost("smtp.example.com");
        mailAccount.setPort(465); // SMTP端口
        mailAccount.setAuth(true);
        mailAccount.setFrom("sender@example.com");
        mailAccount.setUser("sender@example.com");
        mailAccount.setPass("password"); // 发件人邮箱密码或授权码
        // 收件人邮箱
        String to = "recipient@example.com";
        // 发送邮件
        MailUtil.send(mailAccount, to, "测试邮件", "这是一封来自Hutool的测试邮件。");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/721875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day 26:2288. 价格减免

Leetcode 2288. 价格减免 句子 是由若干个单词组成的字符串&#xff0c;单词之间用单个空格分隔&#xff0c;其中每个单词可以包含数字、小写字母、和美元符号 ‘$’ 。如果单词的形式为美元符号后跟着一个非负实数&#xff0c;那么这个单词就表示一个 价格 。 例如 “$100”、…

Corrupt JPEG data: 2 extraneous bytes before marker 0xd9

场景 异常&#xff1a;Corrupt JPEG data: 2 extraneous bytes before marker 0xd9 python语言&#xff0c;CV2读图像数据集&#xff0c;训练目标检测模型。在数据集分批送入模型训练过程中&#xff0c;出现大片图片异常情况。 &#xff08;建议直接去看修复图像方法二&…

做一个30点的四面体结构

这个结构有7层&#xff0c;每层有1&#xff0c;1&#xff0c;3&#xff0c;3&#xff0c;6&#xff0c;6&#xff0c;10个点&#xff0c;共30个点。 30个点的坐标是 {0.0,0.0,6.12372435695795}, {0.0,0.0,0.0}, {-2.8868,-5.0,-2.04124145231931}, {-2.8868,5.0,-2.0412414…

设计神器创作利器矢量图形编辑软件CorelDRAW2024重磅发布啦!

CorelDRAW2024&#xff0c;一款让你的创作无限可能的神器&#xff01;&#x1f3a8;✨ 你是否曾经在寻找一款功能强大、操作简便的设计软件&#xff1f;那么&#xff0c;让我来为你种草一款神奇的产品——CorelDRAW2024&#xff01;&#x1f389;&#x1f929; CorelDRAW全系列…

客户为先,自研为基 | YashanDB产品进化之旅

作为一款全自研的数据库产品&#xff0c;崖山数据库致力于构建自主可控的全栈数据库产品体系&#xff0c;以满足行业用户多元化的需求。 从第一行代码到完整的数据库产品体系&#xff0c;我们为何选择从0到1自研数据库&#xff1f;我们经历了哪些关键的产品节点&#xff1f;每个…

等保2.0对于物联网设备的漏洞管理还有哪些规定?

等保2.0针对物联网设备的漏洞管理&#xff0c;主要规定了以下几个方面&#xff1a; 1. 漏洞发现与识别&#xff1a;要求定期进行漏洞扫描和评估&#xff0c;利用专业的漏洞扫描工具和安全服务&#xff0c;及时发现物联网设备及其软件中的安全漏洞。这包括但不限于操作系统、应…

langchain教程-(1)Prompt模板

LangChain 的核心组件 模型 I/O 封装 LLMs&#xff1a;大语言模型Chat Models&#xff1a;一般基于 LLMs&#xff0c;但按对话结构重新封装PromptTemple&#xff1a;提示词模板OutputParser&#xff1a;解析输出 数据连接封装 Document Loaders&#xff1a;各种格式文件的加载…

扭蛋机小程序:深度探索虚拟寻宝之旅的乐趣

引言 扭蛋机小程序&#xff0c;这个融合了传统与创新的虚拟寻宝乐园&#xff0c;已经吸引了无数玩家的目光。在这个充满惊喜和挑战的虚拟世界里&#xff0c;每一个扭蛋都可能蕴藏着无尽的宝藏。本文将带您深入探索扭蛋机小程序的魅力所在&#xff0c;体验一场别开生面的虚拟寻…

查看服务器端口,如何查看服务器端口是多少并修改

查看服务器端口并修改内容是一个涉及网络管理和系统配置的专业任务。以下是一个详细的步骤说明&#xff0c;用于查看和修改服务器端口。 一、查看服务器端口 1. 使用命令行工具&#xff1a; - 对于Linux或Unix系统&#xff0c;可以使用netstat、lsof或ss等命令来查看端口状…

反馈型振荡器

目录 反馈型振荡器分类 基本工作原理 启动过程 “心脏”LC振荡 起振条件 平衡条件 稳定条件 互感耦合振荡器 电感三端LC振荡器 电容三端LC振荡器 串联改进电容三端式振荡器 并联改进电容三端式振荡器 相位平衡条件的判断准则 反馈型振荡器分类 基本工作原理 启动过…

【ajax基础02】URL详解

一&#xff1a;什么是URL 统一资源定位符(Uniform Resource Locator,缩写&#xff1a;URL),简称网址 二&#xff1a;URL组成 https://baidu.com/index.html 协议 https协议&#xff1a;超文本传输协议&#xff0c;规定了浏览器和服务第之间传输数据的格式 域名&#xff08;在…

JS 实现树形结构的各种操作(2)

一 数据源 以下所有操作&#xff0c;都使用本数据做测试。 const oraData [{id: "1",name: "动物",children: [{id: "1-1",name: "哺乳类",children: [{id: "1-1-1",name: "小猫",children: []},{id: "1-1…

2023年中国数据库市场440亿,云数据库四强(阿里、腾讯、亚马逊、华为),本地数据库四强(Oracle、华为、微软、达梦)

近期IDC公布了中国关系型数据库市场的数据&#xff0c;整体市场276亿人民币&#xff08;38亿美元&#xff09;&#xff0c;其中公有云数据库市场175亿人民币&#xff08;24.1亿美元&#xff09;&#xff0c;备注&#xff1a;汇率按7.26计算。 关系型数据库是数据库整体市场最大…

2024年阿里巴巴全球数学竞赛首次向人工智能(AI)开放

大家好&#xff0c;我是微学AI&#xff0c;最近大家突然开始关注阿里巴巴全球数学竞赛了&#xff0c;在这个人工智能爆发的时代&#xff0c;2024年阿里巴巴全球数学竞赛首次向人工智能&#xff08;AI&#xff09;开放&#xff0c;要求参赛的AI模型在比赛前提交源代码&#xff0…

[Qt的学习日常]--常用控件3

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、显示类控…

Python武器库开发-武器库篇之SQL注入扫描器(五十九)

Python武器库开发-武器库篇之SQL注入扫描器(五十九) SQL注入漏洞简介以及危害 SQL注入漏洞是一种常见的Web应用程序漏洞&#xff0c;攻击者可以利用该漏洞在应用程序的数据库中执行恶意的SQL查询或指令。这可能导致数据泄露、数据损坏、应用程序崩溃或未经授权的访问。 SQL注…

L51--- 144. 二叉树的前序遍历(深搜)---Java版

1.题目描述 2.思路 二叉树的前序遍历遵循 根左右 &#xff08;1&#xff09;方法 preorderTraversal 输入参数: TreeNode root root是二叉树的根节点。 返回值: List 返回一个包含二叉树节点值的列表&#xff0c;这些值按照前序遍历的顺序排列。 功能: 这个方法是前序遍历的…

剖析 Kafka 消息丢失的原因

文章目录 前言一、生产者导致的消息丢失的场景场景1&#xff1a;消息太大解决方案 &#xff1a;1、减少生产者发送消息体体积2、调整参数max.request.size 场景2&#xff1a;异步发送机制解决方案 &#xff1a;1、使用带回调函数的发送方法 场景3&#xff1a;网络问题和配置不当…

React 中的 ErrorBoundary

在 React 中&#xff0c;如果不做任何控制&#xff0c;当组件出现异常时&#xff0c;React 渲染就会停止&#xff0c;页面出现白屏&#xff0c;这种体验很不好。例如当用户输入某些非法数据&#xff0c;而前端都没有进行校验&#xff0c;页面出现白屏。这种情况下&#xff0c;最…

如何训练AI大模型?熬夜爆肝整理大全

随着人工智能技术的快速发展&#xff0c;大型预训练模型在自然语言处理、计算机视觉、语音识别等领域取得了显著成果。这些模型通过在海量数据上进行预训练&#xff0c;能够捕捉到丰富的特征信息&#xff0c;为各种下游任务提供强大的支持。然而&#xff0c;训练AI大模型面临着…