Hutool-工具常用代码集

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool的目标是使用一个工具方法代替一段复杂代码,从而最大限度的避免“复制粘贴”代码的问题,彻底改变我们写代码的方式。

 

准备:引入Hutool依赖

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

一、类型判断

1.1 判断是否是JSON格式
public static void main(String[] args) {
        String data = "{userName:alan,sex:1}";
        boolean isJson = JSONUtil.isJson(data);

        // true
        System.out.println(isJson);
}
1.2 判断是否为Number
public static void main(String[] args) {
        String num = "12.3";
        boolean isNum = NumberUtil.isNumber(num);

        // true
        System.out.println(isNum);
    }

同理,可以调用相应的方法,判断是否为Double,Integer、Long

// 是否为Double
NumberUtil.isDouble(num);

//是否为Integer
NumberUtil.isInteger(num);

//是否为Long
NumberUtil.isLong(num);

二、BeanUtil

2.1 复制Bean对象属性

1、默认拷贝

BeanUtil.copyProperties(Object source, Object target)

2、当拷贝值为null时,不拷贝

public static void main(String[] args) {
        //当拷贝值为null时,不拷贝
        CopyOptions copyOptions = new CopyOptions();
        copyOptions.setIgnoreNullValue(true);

        BeanUtil.copyProperties(null,null,copyOptions);
    }
2.2 对象转Map
Map<String, Object> map = BeanUtil.beanToMap(d);
2.3 Map转对象
DynamicDetailEntity entity = BeanUtil.toBean(map, DynamicDetailEntity.class);

三、类型转换工具类-Convert

3.1 转List
3.1.1 String转List
public class Client {

    public static void main(String[] args) {
        String strs = "a,b,c,d";
        List<String> strList = Convert.toList(String.class,strs);

        //4
        System.out.println(strList.size());

        //[a, b, c, d]
        System.out.println(strList);
    }
}
3.1.2 数组转List
  Object[] a = {"a", "你", "好", "", 1};
  List<?> list = Convert.convert(List.class, a);

  //从4.1.11开始可以这么用
  List<?> list = Convert.toList(a);
3.2 转换为字符串
  int a = 1;
  //aStr为"1"
  String aStr = Convert.toStr(a);

  long[] b = {1,2,3,4,5};
  //bStr为:"[1, 2, 3, 4, 5]"
  String bStr = Convert.toStr(b);
3.3 转换为指定类型数组
  String[] b = { "1", "2", "3", "4" };
  //结果为Integer数组
  Integer[] intArray = Convert.toIntArray(b);

  long[] c = {1,2,3,4,5};
  //结果为Integer数组
  Integer[] intArray2 = Convert.toIntArray(c);
3.4 转换为日期对象
  String a = "2017-05-06";
  Date value = Convert.toDate(a);
3.5 半角和全角转换
  String a = "123456789";

  //结果为:"123456789"
  String sbc = Convert.toSBC(a);
3.6 编码转换
  String a = "我不是乱码";
  //转换后result为乱码
  String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);
  String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");
  Assert.assertEquals(raw, a);
3.7 时间单位转换
long a = 4535345;

//结果为:75分钟
long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);
3.8 金额大小写转换
double a = 67556.32;

//结果为:"陆万柒仟伍佰伍拾陆元叁角贰分"
String digitUppercase = Convert.digitToChinese(a);

注意 转换为大写只能精确到分(小数点儿后两位),之后的数字会被忽略。

3.9 数字转换
3.9.1 数字转为英文表达
  // ONE HUNDRED AND CENTS TWENTY THREE ONLY
  String format = Convert.numberToWord(100.23);
3.9.2 数字简化
  // 1.2k
  String format1 = Convert.numberToSimple(1200);
3.9.3 数字中文表示转换为数字
  // 1012
  int f1 = Convert.chineseToNumber("一千零一十二");      

四、统计代码的耗时

常规统计方式

 public static void main(String[] args) throws InterruptedException {
        final Long start = System.currentTimeMillis();
        // 此处以线程睡眠代替执行代码逻辑
        Thread.sleep(1000);
        final Long end = System.currentTimeMillis();
        
        //代码耗时:1016ms
        System.out.println("代码耗时:" + (end - start) + "ms");
    }

Hutool统计方式

public static void main(String[] args) throws InterruptedException {
        final TimeInterval timer = DateUtil.timer();
        // 此处以线程睡眠代替执行代码逻辑
        Thread.sleep(1000);

        //1001
        System.out.println(timer.interval());

        //1秒2毫秒
        System.out.println(timer.intervalPretty());
    }

五、信息脱敏工具-DesensitizedUtil

我们以身份证号码为例:

// 5***************1X
DesensitizedUtil.idCardNum("51343620000320711X", 1, 2);

对于约定俗成的脱敏,我们可以不用指定隐藏位数,比如手机号:

// 180****1999
DesensitizedUtil.mobilePhone("18049531999");

当然还有一些简单粗暴的脱敏,比如密码,只保留了位数信息:

// **********
DesensitizedUtil.password("1234567890");

六、随机工具-RandomUtil

6.1 获得指定范围内的随机数

RandomUtil.randomInt 获得指定范围内的随机数。例如我们想产生一个[10, 100)的随机数,则:

int c = RandomUtil.randomInt(10, 100);
6.2 随机bytes

RandomUtil.randomBytes 随机bytes,一般用于密码或者salt生成

byte[] c = RandomUtil.randomBytes(10);
6.3 随机获得列表中的元素

RandomUtil.randomEle 随机获得列表中的元素。可应用于抽签功能

6.4 随机获得列表中的一定量的不重复元素

RandomUtil.randomEleSet 随机获得列表中的一定量的不重复元素,返回Set

Set<Integer> set = RandomUtil.randomEleSet(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2);

6.5 获得一个随机的字符串

RandomUtil.randomString 获得一个随机的字符串(只包含数字和字符)

6.6 获得一个只包含数字的字符串

RandomUtil.randomNumbers 获得一个只包含数字的字符串

6.7 权重随机生成器

RandomUtil.weightRandom 权重随机生成器,传入带权重的对象,然后根据权重随机获取对象。

可应用于抽奖活动,一等奖、二等奖、三等奖 中奖概率不一样

七、SecureUtil加密工具

7.1 sha1签名
    String  string1="待签名字符串";
    String signature = SecureUtil.sha1(string1);

    // signature : a9fece7ef7cea1e1415be3c6423fba649a0757fd

八、时间工具类DateUtil

8.1 获取当前时间时间戳
public static void main(String[] args) {
        //毫秒:1650432761873
        Long timestamp = DateUtil.current();
        System.out.println(timestamp);

        //秒:1650432761
        Long seconds = DateUtil.currentSeconds();
        System.out.println(seconds);
    }

源码

/**
     * 当前时间的时间戳
     *
     * @return 时间
     */
    public static long current() {
        return System.currentTimeMillis();
    }

九、线程工具-ThreadUtil

9.1 异步执行
  • ThreadUtil.execAsync:执行异步方法

  • ThreadUtil.execute:直接在公共线程池中执行线程

  • ThreadUtil.newExecutor:获得一个新的线程池

  • ThreadUtil.newCompletionService:创建CompletionService,调用其submit方法可以异步执行多个任务,最后调用take方法按照完成的顺序获得其结果。若未完成,则会阻塞。

  • ThreadUtil.newCountDownLatch:新建一个CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

  • ThreadUtil.sleep:挂起当前线程,是Thread.sleep的封装,通过返回boolean值表示是否被打断,而不是抛出异常。

示例代码

public class Client {

    public static void main(String[] args) {
        final TimeInterval timer = DateUtil.timer();

        /**
         * 1、执行异步方法
         */
        ThreadUtil.execAsync(() -> {
            ThreadUtil.sleep(3000);
            System.out.println("execAsync");
            return true;
        });

        System.out.println("1、耗时:"+timer.intervalPretty());


        /**
         * 2、直接在公共线程池中执行线程
         */
        ThreadUtil.execute(() -> System.out.println("execute"));

        /**
         * 3、获得一个新的线程池
         */
        ExecutorService executorService = ThreadUtil.newExecutor();

        /**
         * 4、创建CompletionService,调用其submit方法可以异步执行多个任务,最后调用take方法按照完成的顺序获得其结果。若未完成,则会阻塞。
         */
        try {
            CompletionService completionService = ThreadUtil.newCompletionService();
            Object result = completionService.submit(() -> {
                ThreadUtil.sleep(3000);
                System.out.println("completionService.submit 1");
                return true;
            }).get();

            Object result2 = completionService.submit(() -> {
                System.out.println("completionService.submit 2");
                return false;
            }).get();

            completionService.take();

            System.out.println("result = "+result+"; result2 = "+result2);
            System.out.println("4、耗时:"+timer.intervalPretty());
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("end 4");


        /**
         * 5、新建一个CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
         */
        CountDownLatch countDownLatch = ThreadUtil.newCountDownLatch(2);
    }
}

执行结果

1、耗时:45毫秒
execute
completionService.submit 1
execAsync
completionService.submit 2
result = true; result2 = false
4、耗时:3秒59毫秒
end 4
9.2 ConcurrencyTester高并发测试

很多时候,我们需要简单模拟N个线程调用某个业务测试其并发状况,可以可使用ConcurrencyTester

public class Client {

    public static void main(String[] args) {
        ConcurrencyTester tester = ThreadUtil.concurrencyTest(100, () -> {
            //调用逻辑内容
            doTest();
        });

        //获取总的执行时间,单位毫秒
        System.out.println("执行总时间:"+tester.getInterval());
    }

    /**
     * 测试的逻辑内容
     */
    private static void doTest() {
        System.out.println("doTest:"+DateUtil.now());

        long delay = RandomUtil.randomLong(100, 1000);
        ThreadUtil.sleep(delay);

        Console.log("{} test finished, delay: {}", Thread.currentThread().getName(), delay);
    }
}

十、EscapeUtil转义和反转义

10.1 转义
    public static void main(String[] args) {
        String str = EscapeUtil.escape("http://图片.png");

        //http%3a//%u56fe%u7247.png
        System.out.println(str);
    }
10.2 反转义
    public static void main(String[] args) {
        String str = EscapeUtil.unescape("http%3a//%u56fe%u7247.png");

        //http://图片.png
        System.out.println(str);
    }

十一、URLUtil

11.1 标准化化URL链接

标准化化URL链接。对于不带http://头的地址做简单补全

    public static void main(String[] args) {
        String url = "www.jianshu.com/图片.png";
        String normalize = URLUtil.normalize(url);

        //http://www.jianshu.com/
        System.out.println(normalize);
    }
11.2 转码
    public static void main(String[] args) {
        String str = URLUtil.encode("http://图片.png");

        //http://%E5%9B%BE%E7%89%87.png
        System.out.println(str);
    }
11.3 解码
    public static void main(String[] args) {
        String str = URLUtil.decode("http://%E5%9B%BE%E7%89%87.png");

        //http://图片.png
        System.out.println(str);
    }

十二、RuntimeUtil执行cmd、shell命令

在Java世界中,如果想与其它语言打交道,处理调用接口,或者JNI,就是通过本地命令方式调用了。Hutool封装了JDK的Process类,用于执行命令行命令(在Windows下是cmd,在Linux下是shell命令)。

String str = RuntimeUtil.execForStr("ipconfig");

结果

Windows IP 配置

以太网适配器 以太网:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::xxx:c7a7:xxx:8df8%7
   IPv4 地址 . . . . . . . . . . . . : xxx.16.10.25
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : xxx.16.xx.1

无线局域网适配器 本地连接* 1:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . :

无线局域网适配器 本地连接* 2:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . :

无线局域网适配器 WLAN:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . : DHCP HOST

以太网适配器 蓝牙网络连接:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . :

Process finished with exit code 0

十三、IdcardUtil身份证工具

IdcardUtil现在支持大陆15位、18位身份证,港澳台10位身份证。

  • isValidCard 验证身份证是否合法

  • convert15To18 身份证15位转18位

  • getBirthByIdCard 获取生日

  • getAgeByIdCard 获取年龄

  • getYearByIdCard 获取生日年

  • getMonthByIdCard 获取生日月

  • getDayByIdCard 获取生日天

  • getGenderByIdCard 获取性别

  • getProvinceByIdCard 获取省份

十四、MathUtil数学相关

14.1 方法

排列

  • arrangementCount 计算排列数
  • arrangementSelect 排列选择(从列表中选择n个排列)

组合

  • combinationCount 计算组合数,即C(n, m) = n!/((n-m)! * m!)
  • combinationSelect 组合选择(从列表中选择n个组合)
14.2 样例-combinationSelect组合选择
  public static void main(String[] args) {
        String[] data = {"A","B","C","D"};
        List<String[]> list = MathUtil.combinationSelect(data,3);
        for(String[] itemArry : list){
            for(String e : itemArry){
                System.out.print(e+" ");
            }
            System.out.println();
        }
    }

结果

A B C
A B D
A C D
B C D

Process finished with exit code 0

十五、ImgUtil图片工具

15.1 scale 缩放图片

提供两种重载方法:其中一个是按照长宽缩放,另一种是按照比例缩放。

ImgUtil.scale(
    FileUtil.file("d:/face.jpg"),
    FileUtil.file("d:/face_result.jpg"),
    0.5f//缩放比例
);
15.2 cut 剪裁图片
ImgUtil.cut(
    FileUtil.file("d:/face.jpg"),
    FileUtil.file("d:/face_result.jpg"),
    new Rectangle(200, 200, 100, 100)//裁剪的矩形区域
);
15.3 slice 按照行列剪裁切片(将图片分为20行和20列)
ImgUtil.slice(FileUtil.file("e:/test2.png"), FileUtil.file("e:/dest/"), 10, 10);
15.4 convert 图片类型转换,支持GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG等
ImgUtil.convert(FileUtil.file("e:/test2.png"), FileUtil.file("e:/test2Convert.jpg"));
15.5 gray 彩色转为黑白
ImgUtil.gray(FileUtil.file("d:/logo.png"), FileUtil.file("d:/result.png"));
15.6 pressText 添加文字水印
ImgUtil.pressText(//
    FileUtil.file("e:/pic/face.jpg"), //
    FileUtil.file("e:/pic/test2_result.png"), //
    "版权所有", Color.WHITE, //文字
    new Font("黑体", Font.BOLD, 100), //字体
    0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
    0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
    0.8f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
);
15.7 pressImage 添加图片水印
ImgUtil.pressImage(
    FileUtil.file("d:/picTest/1.jpg"),
    FileUtil.file("d:/picTest/dest.jpg"),
    ImgUtil.read(FileUtil.file("d:/picTest/1432613.jpg")), //水印图片
    0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
    0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
    0.1f
);
15.8 rotate 旋转图片
// 旋转180度
BufferedImage image = ImgUtil.rotate(ImageIO.read(FileUtil.file("e:/pic/366466.jpg")), 180);
ImgUtil.write(image, FileUtil.file("e:/pic/result.png"));
15.9 flip 水平翻转图片
ImgUtil.flip(FileUtil.file("d:/logo.png"), FileUtil.file("d:/result.png"));

十六、Img图片编辑器

16.1 图像切割
// 将face.jpg切割为原型保存为face_radis.png
Img.from(FileUtil.file("e:/pic/face.jpg"))
    .cut(0, 0, 200)//
    .write(FileUtil.file("e:/pic/face_radis.png"));
16.2 图片压缩
Img.from(FileUtil.file("e:/pic/1111.png"))
    .setQuality(0.8)//压缩比率
    .write(FileUtil.file("e:/pic/1111_target.jpg"));

十七、QrCodeUtil二维码工具

17.1 生成二维码
17.1.1 简单样例
// 生成指定url对应的二维码到文件,宽和高都是300像素
QrCodeUtil.generate("https://www.jianshu.com/", 300, 300, FileUtil.file("d:/qrcode.jpg"));
17.1.2 自定义参数

基本参数设定:通过QrConfig可以自定义二维码的生成参数,例如长、宽、二维码的颜色、背景颜色、边距等参数,使用方法如下

QrConfig config = new QrConfig(300, 300);
// 设置边距,既二维码和背景之间的边距
config.setMargin(3);
// 设置前景色,既二维码颜色(青色)
config.setForeColor(Color.CYAN.getRGB());
// 设置背景色(灰色)
config.setBackColor(Color.GRAY.getRGB());

// 生成二维码到文件,也可以到流
QrCodeUtil.generate("https://www.jianshu.com/", config, FileUtil.file("e:/qrcode.jpg"));

附带logo小图标

QrCodeUtil.generate(//
    "http://hutool.cn/", //二维码内容
    QrConfig.create().setImg("e:/logo_small.jpg"), //附带logo
    FileUtil.file("e:/qrcodeWithLogo.jpg")//写出到的文件
);
17.2 识别二维码
// decode -> "https://www.jianshu.com/"
String decode = QrCodeUtil.decode(FileUtil.file("d:/qrcode.jpg"));

十八、EmojiUtil工具

18.1 转义Emoji字符
String alias = EmojiUtil.toAlias("😄");//:smile:
18.2 将转义的别名转为Emoji字符
String emoji = EmojiUtil.toUnicode(":smile:");//😄
18.3 将字符串中的Unicode Emoji字符转换为HTML表现形式
String alias = EmojiUtil.toHtml("😄");//&#128102;

十八、PinyinUtil拼音工具

18.1 引入库

以下为Hutool支持的拼音库的pom坐标,你可以选择任意一个引入项目中,如果引入多个,Hutool会按照以上顺序选择第一个使用。

<dependency>
    <groupId>io.github.biezhi</groupId>
    <artifactId>TinyPinyin</artifactId>
    <version>2.0.3.RELEASE</version>
</dependency>

<dependency>
    <groupId>com.belerweb</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.1</version>
</dependency>

<dependency>
    <groupId>com.github.stuxuhai</groupId>
    <artifactId>jpinyin</artifactId>
    <version>1.1.8</version>
</dependency>
18.2 使用
18.2.1 获取拼音
// "ni hao"
String pinyin = PinyinUtil.getPinyin("你好", " ");

这里定义的分隔符为空格,你也可以按照需求自定义分隔符,亦或者使用""无分隔符。

18.2.2

获取拼音首字母

// "h, s, d, y, g"
String result = PinyinUtil.getFirstLetter("H是第一个", ", ");
18.2.3 自定义拼音库(拼音引擎)
Pinyin4jEngine engine = new Pinyin4jEngine();

// "ni hao h"
String pinyin = engine.getPinyin("你好h", " ");

十九、ExpressionUtil表达式工具

19.1 引入库

首先引入我们需要的模板引擎,引入后,Hutool借助SPI机制可自动识别使用,我们以Aviator为例:

<dependency>
    <groupId>com.googlecode.aviator</groupId>
    <artifactId>aviator</artifactId>
    <version>5.2.7</version>
</dependency>
19.2 执行表达式
final Dict dict = Dict.create()
        .set("a", 100.3)
        .set("b", 45)
        .set("c", -199.100);

// -143.8
final Object eval = ExpressionUtil.eval("a-(b-c)", dict);

二十、Script工具-ScriptUtil

20.1 执行Javascript脚本
ScriptUtil.eval("print('Script test!');");
20.2 编译脚本
  CompiledScript script = ScriptUtil.compile("print('Script test!');");
  try {
      script.eval();
  } catch (ScriptException e) {
      throw new ScriptRuntimeException(e);
  }

二十一、系统属性调用-SystemUtil

21.1 Java Virtual Machine Specification信息
SystemUtil.getJvmSpecInfo();

结果

JavaVM Spec. Name:    Java Virtual Machine Specification
JavaVM Spec. Version: 1.8
JavaVM Spec. Vendor:  Oracle Corporation


Process finished with exit code 0
21.2 Java Virtual Machine Implementation信息
SystemUtil.getJvmInfo();
21.3 Java Specification信息
SystemUtil.getJavaSpecInfo();
21.4 系统信息
SystemUtil.getOsInfo();
21.5 当前主机网络地址信息
SystemUtil.getHostInfo();
21.6 运行时信息,包括内存总大小、已用大小、可用大小等
SystemUtil.getRuntimeInfo();

结果

Max Memory:    3.53 GB
Total Memory:     243.5 MB
Free Memory:     233.21 MB
Usable Memory:     3.52 GB


Process finished with exit code 0

二十二、图形验证码Hutool-captcha

  //定义图形验证码的长和宽
  LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);

  //图形验证码写出,可以写出到文件,也可以写出到流
  lineCaptcha.write("d:/line.png");
  //输出code
  Console.log(lineCaptcha.getCode());
  //验证图形验证码的有效性,返回boolean值
  lineCaptcha.verify("1234");

  //重新生成验证码
  lineCaptcha.createCode();
  lineCaptcha.write("d:/line.png");
  //新的验证码
  Console.log(lineCaptcha.getCode());
  //验证图形验证码的有效性,返回boolean值
  lineCaptcha.verify("1234");

二十三、CharUtil-字符工具类

//判断是否为emoji表情符
isEmoji(char c)

//是否为Windows或者Linux(Unix)文件分隔符,Windows平台下分隔符为\,Linux(Unix)为/
isFileSeparator(char c)

//判断是否为字母(包括大写字母和小写字母)字母包括A~Z和a~z
isLetter(char ch)

//检查字符是否为小写字母,小写字母指a~z
isLetterLower(char ch)

//判断是否为大写字母,大写字母包括A~Z
isLetterUpper(char ch)

//检查是否为数字字符,数字字符指0~9
isNumber(char ch)

//是否为字母或数字,包括A~Z、a~z、0~9
isLetterOrNumber(char ch)

二十四、ListUtil

24.1 将Map的kyes(Set)转成List
public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("A", "a");
        map.put("B", "b");

        List<String> keyList = ListUtil.toList(map.keySet());

        //[A, B]
        System.out.println(keyList);
    }

二十五、HtmlUtil

针对Http请求中返回的Http内容,Hutool使用此工具类来处理一些HTML页面相关的事情。

HtmlUtil.restoreEscaped 还原被转义的HTML特殊字符

HtmlUtil.encode 转义文本中的HTML字符为安全的字符

HtmlUtil.cleanHtmlTag 清除所有HTML标签

HtmlUtil.removeHtmlTag 清除指定HTML标签和被标签包围的内容

HtmlUtil.unwrapHtmlTag 清除指定HTML标签,不包括内容

HtmlUtil.removeHtmlAttr 去除HTML标签中的属性

HtmlUtil.removeAllHtmlAttr 去除指定标签的所有属性

HtmlUtil.filter 过滤HTML文本,防止XSS攻击

二十六、URL生成器-UrlBuilder

26.1 完整构建
// https://www.hutool.cn/aaa/bbb?ie=UTF-8&wd=test
String buildUrl = UrlBuilder.create()
    .setScheme("https")
    .setHost("www.hutool.cn")
    .addPath("/aaa").addPath("bbb")
    .addQuery("ie", "UTF-8")
    .addQuery("wd", "test")
    .build();
26.2 中文编码

当参数中有中文时,自动编码中文,默认UTF-8编码,也可以调用setCharset方法自定义编码。

// https://www.hutool.cn/s?ie=UTF-8&ie=GBK&wd=%E6%B5%8B%E8%AF%95
String buildUrl = UrlBuilder.create()
    .setScheme("https")
    .setHost("www.hutool.cn")
    .addPath("/s")
    .addQuery("ie", "UTF-8")
    .addQuery("ie", "GBK")
    .addQuery("wd", "测试")
    .build();
26.3 解析

当有一个URL字符串时,可以使用of方法解析:

UrlBuilder builder = UrlBuilder.ofHttp("www.hutool.cn/aaa/bbb/?a=张三&b=%e6%9d%8e%e5%9b%9b#frag1", CharsetUtil.CHARSET_UTF_8);

// 输出张三
Console.log(builder.getQuery().get("a"));
// 输出李四
Console.log(builder.getQuery().get("b"));

我们发现这个例子中,原URL中的参数a是没有编码的,b是编码过的,当用户提供此类混合URL时,Hutool可以很好的识别并全部decode,当然,调用build()之后,会全部再encode。

26.4 构建URL
UrlBuilder urlBuilder = UrlBuilder.ofHttp("https://restapi.amap.com/v3/geocode/geo", CharsetUtil.CHARSET_UTF_8);

urlBuilder.addQuery("key", "c7262438248c0c6fdd5d0300");
urlBuilder.addQuery("address", ZhuHai);

String httpUrl = urlBuilder.toString();
String s = HttpUtil.get(httpUrl);

//httpUrl : https://restapi.amap.com/v3/geocode/geo?key=c7262438248d3c0c6fdd80672a5d0300&address=ZhuHai

二十七、StrUtil

27.1 字符串截取
public static void main(String[] args) {
        String str = "我人有的和";
        String newStr = StrUtil.sub(str,0,2);
        String newStr2 = StrUtil.sub(str,0,9);
        System.out.println(newStr);
        System.out.println(newStr2);
    }

结果:



作者:陈琰AC
链接:http://events.jianshu.io/p/ce17f4bed1a1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2022-12-01 11:17  hanease  阅读(1982)  评论(0编辑  收藏  举报