Spring核心基础:全面总结Spring中提供的那些基础工具类!

Spring核心基础:全面总结Spring中提供的那些基础工具类! - 程序员古德

内容概要

Spring Framework 提供了众多实用的工具类,这些工具类在简化开发流程、提升代码质量和维护性方面发挥了重要作用,以下是部分关键工具类的总结及其使用场景:

  1. StringUtils:不仅提供了基础的字符串操作,如拼接、拆分、大小写转换,还包含了更高级的功能,如检查字符串是否为空或只包含空白字符,在开发中,这可以避免空指针异常,并简化字符串的预处理工作。
  2. CollectionUtils:当处理集合时,这个工具类提供了很多有用的方法,如集合的合并、筛选、查找等,它特别有用在需要处理复杂集合逻辑时,可以大大简化代码。
  3. ArrayUtils:与集合相似,这个工具类为数组提供了查找、排序等功能,在处理原生数组或遗留代码时尤其有用。
  4. ResourceUtils:在加载配置文件、资源文件时,这个工具类是不可或缺的,它简化了类路径下资源的访问和管理。
  5. ReflectionUtils:反射在Java中是一个强大但复杂的特性,这个工具类提供了安全、便捷的反射调用方法,使得开发者可以更容易地访问和修改对象的内部状态。
  6. Assert:在编写健壮的代码时,断言是一个重要的工具,这个工具类用于验证方法参数的有效性,可以在开发早期发现潜在的错误。

这些工具类,特别是StringUtilsCollectionUtils,在日常开发中经常用到,可以大大提高开发效率和代码质量,它们大多位于org.springframework.util包下。

Spring核心基础:全面总结Spring中提供的那些基础工具类! - 程序员古德

Assert使用

主要功能

Assert类是Spring框架中的一个实用工具类,它提供了一系列静态方法,用于在代码中执行断言操作,断言是一种编程技术,用于在程序执行过程中检查某些条件是否为真,如果条件不满足(即断言失败),则会立即抛出异常,中断程序的正常流程。

Assert类的主要功能包括:

  1. 参数校验:确保方法或构造函数的参数满足特定的前提条件。
  2. 状态检查:在程序执行过程中验证对象或系统的状态。
  3. 早期错误检测:允许在开发阶段尽早发现潜在的错误,减少调试时间。

使用场景

Assert类通常在以下场景中使用:

  • 开发阶段:在编写代码时,使用断言来验证假设和约束条件,帮助开发者更快地识别和修复错误。
  • 测试阶段:在编写单元测试或集成测试时,使用断言来验证方法的输出是否符合预期。
  • 生产环境(可选):通常不推荐在生产环境中使用断言(因为它会影响性能),但在某些情况下,如果断言的开销可以接受,并且它们对于防止严重错误非常关键,那么也可以考虑在生产环境中启用断言。

代码案例

使用Assert类进行参数校验非常简单,下面是一些常用的Assert方法和它们的使用示例:

notNull(Object object, String message)

检查对象是否为null,如果为null,则抛出IllegalArgumentException

public void setSomeObject(Object someObject) {  Assert.notNull(someObject, "The 'someObject' parameter must not be null");  // ... 其他逻辑  
}

hasLength(String text, String message)

检查字符串是否有长度(即不为null且长度大于0),如果不满足条件,则抛出IllegalArgumentException

public void setName(String name) {  Assert.hasLength(name, "The 'name' parameter must have length");  // ... 其他逻辑  
}

hasText(String text, String message)

检查字符串是否包含非空白字符,如果不满足条件,则抛出IllegalArgumentException

public void setDescription(String description) {  Assert.hasText(description, "The 'description' parameter must have text content");  // ... 其他逻辑  
}

isTrue(boolean expression, String message):

检查给定的布尔表达式是否为true,如果不是,则抛出IllegalArgumentException

public void performAction(boolean isValid) {  Assert.isTrue(isValid, "The action cannot be performed unless it is valid");  // ... 执行动作  
}

state(boolean expression, String message):

用于状态验证,检查对象或系统的状态是否满足某个条件,如果不满足,则抛出IllegalStateException

public void updateStatus() {  boolean isReady = checkIfReady();  Assert.state(isReady, "The object must be in a ready state before updating the status");  // ... 更新状态  
}  private boolean checkIfReady() {  // ... 检查对象是否准备好  return true; // 假设对象已准备好  
}

StringUtils

主要功能

StringUtils是Spring Framework中非常常用的一个工具类,主要用于处理String相关的操作,值得注意的是,Spring本身提供了多个版本的StringUtils类,分别在org.springframework.utilorg.springframework.web.util包中,这两个版本的StringUtils都提供了一系列与String相关的实用方法,但在功能和用途上略有不同。

在Spring Framework 5中,org.springframework.util.StringUtils是更为通用和核心的版本,提供了如下主要功能:

  1. 判断字符串是否为空或空白:如hasLength(String str)hasText(String str)等方法用于检查字符串是否为空、null或仅包含空白字符。
  2. 字符串截取与操作:提供了如substringMatch(String str, int index, String substring)等方法,用于字符串的子串匹配、截取等操作。
  3. 字符串分割与连接:包括commaDelimitedListToStringArray(String str)arrayToCommaDelimitedString(Object[] arr)等方法,用于字符串的分割与连接。
  4. 字符串替换:提供了replace(String inString, String oldPattern, String newPattern)等方法,用于字符串的查找替换。
  5. 大小写转换:包括capitalize(String str)uncapitalize(String str)等方法,用于字符串的大小写转换。
  6. 其他实用功能:如quote(String str)unquote(String quotedStr)等,用于对字符串进行加引号或去引号处理。

StringUtils的使用场景非常广泛,几乎在涉及到字符串处理的任何地方都可能用到,例如,在进行参数校验、日志记录、字符串格式化、数据转换等操作时,都可以考虑使用StringUtils提供的实用方法。

代码案例

以下是一些使用StringUtils进行参数校验的代码示例:

import org.springframework.util.StringUtils;  public class StringUtilsExample {  public static void main(String[] args) {  // 检查字符串是否为空  String input = "";  if (StringUtils.hasLength(input)) {  System.out.println("输入字符串不为空");  } else {  System.out.println("输入字符串为空");  }  // 检查字符串是否包含实际文本(非空白字符)  String text = "   ";  if (StringUtils.hasText(text)) {  System.out.println("字符串包含实际文本");  } else {  System.out.println("字符串不包含实际文本");  }  // 字符串截取与判断  String example = "Hello, World!";  boolean isMatched = StringUtils.substringMatch(example, 0, "Hello");  if (isMatched) {  System.out.println("子串匹配成功");  } else {  System.out.println("子串匹配失败");  }  // 字符串替换  String replaced = StringUtils.replace(example, "World", "Spring");  System.out.println(replaced); // 输出: Hello, Spring!  }  
}

CollectionUtils

主要功能

在Spring Framework中,CollectionUtils是一个非常实用的工具类,用于简化对集合(Collection)对象的常见操作,在Spring 5及之后的版本中,许多集合相关的实用功能已被移到org.springframework.util.CollectionUtils这个类,而这个类并不是专门处理集合的,而是包含了一系列与集合相关的静态工具方法。

Spring Framework并没有一个像Apache Commons Collections库那样的全功能CollectionUtils类,因此在处理集合时,开发人员需要结合使用Java标准库和Spring提供的工具方法。

org.springframework.util.CollectionUtils类提供了一些有用的静态方法,如:

  1. isEmpty(Collection<?> collection): 判断一个集合是否为空或null。
  2. containsInstance(Collection<?> collection, Object element): 判断集合中是否包含指定元素(使用==进行实例比较,而不是.equals()方法)。
  3. hasUniqueObject(Collection<?> collection): 判断集合是否只包含一个唯一的元素。
  4. mergeArrayIntoCollection(Object array, Collection<E> collection): 将数组元素合并到集合中。

代码案例

这里举一个使用org.springframework.util.CollectionUtils类的例子:

import org.springframework.util.CollectionUtils;  import java.util.ArrayList;  
import java.util.List;  public class CollectionUtilsExample {  public static void main(String[] args) {  // 创建一个空的集合  List<String> emptyList = new ArrayList<>();  // 使用CollectionUtils判断集合是否为空  boolean isEmpty = CollectionUtils.isEmpty(emptyList);  System.out.println("Is the list empty? " + isEmpty); // 输出: Is the list empty? true  // 创建一个包含元素的集合  List<String> elements = new ArrayList<>();  elements.add("element1");  elements.add("element2");  // 使用CollectionUtils判断集合是否包含特定实例  boolean contains = CollectionUtils.containsInstance(elements, "element1");  System.out.println("Does the list contain 'element1'? " + contains); // 输出: Does the list contain 'element1'? true  // 注意:这里使用的是实例比较,因此以下情况将返回false  String anotherElement1 = new String("element1");  boolean doesNotContain = CollectionUtils.containsInstance(elements, anotherElement1);  System.out.println("Does the list contain another instance of 'element1'? " + doesNotContain); // 输出: Does the list contain another instance of 'element1'? false  // 如果要进行值比较,应使用Collection的contains方法  boolean containsValue = elements.contains(anotherElement1);  System.out.println("Does the list contain the value of 'element1'? " + containsValue); // 输出: Does the list contain the value of 'element1'? true  // 使用CollectionUtils合并数组到集合中  String[] moreElements = {"element3", "element4"};  CollectionUtils.mergeArrayIntoCollection(moreElements, elements);  System.out.println("Elements after merging: " + elements); // 输出: Elements after merging: [element1, element2, element3, element4]  }  
}

Spring Framework中的CollectionUtils并没有提供太多集合操作功能,它主要关注于集合的空检查和一些简单的集合操作,对于更复杂的集合处理,通常建议使用Java标准库提供的集合工具类,如CollectionsArrays,或者考虑使用第三方库,如Apache Commons CollectionsGuava库等。

ObjectUtils

主要功能

ObjectUtils 提供了许多操作对象的有用方法,这个类主要用于简化空值处理、对象比较、类型转换等常见任务,如下:

  1. 空值处理ObjectUtils 提供了一系列静态方法来判断对象是否为空或者是否为空字符串,例如,isEmpty() 方法可以检查一个对象是否为 null 或者空字符串。
  2. 对象比较:这个类包含用于比较两个对象的方法,nullSafeEquals() 方法允许比较两个对象,即使它们是 null 也不会抛出异常。
  3. 类型转换ObjectUtils 提供了一些类型转换方法,如将对象转换为字符串或者将字符串转换为指定类型的对象。
  4. 其他实用功能:此外,这个类还提供了一些其他有用的功能,如获取对象的类类型、获取对象的哈希码等。

ObjectUtils 类在处理 Java 对象时非常有用,特别是在以下场景中:

  • 当需要处理可能为 null 的对象时,可以使用 ObjectUtils 来进行空值检查。
  • 在比较两个对象是否相等时,可以使用 nullSafeEquals() 方法来避免 NullPointerException
  • 在进行类型转换时,可以使用 ObjectUtils 提供的类型转换方法。

代码案例

下面是一些使用 ObjectUtils 类的代码示例:

import org.springframework.util.ObjectUtils;  public class ObjectUtilsExample {  public static void main(String[] args) {  // 空值检查  String str1 = null;  String str2 = "";  boolean isEmpty1 = ObjectUtils.isEmpty(str1); // true  boolean isEmpty2 = ObjectUtils.isEmpty(str2); // false  // 对象比较  String a = "hello";  String b = "hello";  boolean equals = ObjectUtils.nullSafeEquals(a, b); // true  // 类型转换  String numberStr = "123";  int number = ObjectUtils.convertIfNecessary(numberStr, Integer.class); // 123  // 使用 ObjectUtils.identityToString() 获取对象的类名和哈希码  String objIdentity = ObjectUtils.identityToString(a);  System.out.println(objIdentity); // 输出类似于 "String@15db9742"  }  
}

ClassUtils

主要功能

ClassUtils是一个提供类级别操作的实用工具类,它包含了一系列静态方法,用于处理与Java类相关的各种常见任务,如获取类名、判断类是否存在、解析类名、确定类是否是原始类型、获取用户定义的类(而非代理或CGLIB生成的子类)等。

ClassUtils的主要功能包括:

  1. 类名处理:将完整的类名转换为简化的类名,或反之。
  2. 类存在性检查:确定给定的类名是否表示一个有效的、可加载的类。
  3. 基本类型识别:确定类是否代表基本类型,如int, boolean等。
  4. 用户定义的类获取:能够返回实际编写的类,而非Spring AOP或其他库生成的代理类。
  5. 类加载:使用特定的类加载器加载类。
  6. 数组类型转换:转换对象数组到指定的组件类型。
  7. 接口和父类检查:判断类是否实现了特定的接口或继承自特定的父类。

它特别适合在以下场景场景:

  1. 在Spring内部,ClassUtils被用于多种场景,如解析bean定义、处理AOP代理、类型转换等。
  2. 在应用程序代码中,开发人员可能会使用ClassUtils来执行与类相关的操作,尤其是在处理反射时。

假设,想检查一个类是否实现了特定的接口,可以使用ClassUtilsisAssignable()方法,如下代码:

import org.springframework.util.ClassUtils;  public class ClassUtilsExample {  public static void main(String[] args) {  // 检查String类是否实现了Serializable接口  boolean isSerializable = ClassUtils.isAssignable(Serializable.class, String.class);  System.out.println("Is String Serializable? " + isSerializable); // 应该输出true  // 检查自定义类是否实现了Serializable接口  boolean isMyClassSerializable = ClassUtils.isAssignable(Serializable.class, MyClass.class);  System.out.println("Is MyClass Serializable? " + isMyClassSerializable);  }  // 自定义类  static class MyClass implements Serializable {  // 类的实现  }  
}

BeanUtils

主要功能

BeanUtils 用于操作JavaBean,这个类包含了大量有用的方法,用于处理JavaBean的属性,如复制属性、描述属性、比较属性等,Spring Framework 5中的BeanUtils位于org.springframework.beans包下,主要的功能包括:

  1. 属性复制BeanUtils类提供了copyProperties方法,用于将一个JavaBean的属性值复制到另一个JavaBean中。这是它最常用的功能之一。
  2. 属性描述:通过PropertyDescriptor类,BeanUtils能够获取和设置JavaBean的属性。
  3. 简单类型转换BeanUtils也提供了类型转换的功能,尽管它不像ConversionService那样强大和灵活。
  4. 其他实用方法:还包括检查两个Bean是否相等、查找嵌套Bean的属性等。

它特别适合在以下场景场景:

  1. 数据传输对象(DTO)和领域对象之间的转换:当有一个用于前端交互的数据传输对象和一个用于业务逻辑的领域对象时,可能需要在两者之间复制属性,BeanUtils可以非常方便地完成这个任务。
  2. 在Spring MVC中处理表单提交:当用户提交表单时,Spring MVC通常会将表单数据绑定到一个JavaBean上,之后,可能需要将这个JavaBean的数据复制到另一个JavaBean中以进行进一步处理。
  3. 单元测试:在单元测试中,可能需要创建测试数据,并将这些数据从一个对象复制到另一个对象,BeanUtils提供了方便的方法来完成这个任务。

代码案例

假设有两个类,UserUserDTO,想要将UserDTO的属性复制到User中,如下代码:

import org.springframework.beans.BeanUtils;  public class User {  private String username;  private String password;  // getters and setters  
}  public class UserDTO {  private String username;  private String password;  // getters and setters  
}  public class Main {  public static void main(String[] args) {  UserDTO userDTO = new UserDTO();  userDTO.setUsername("john");  userDTO.setPassword("secret");  User user = new User();  BeanUtils.copyProperties(userDTO, user);  System.out.println(user.getUsername()); // Outputs: john  }  
}

在这个例子中,创建了一个UserDTO对象并设置了它的属性,然后,创建了一个空的User对象,并使用BeanUtils.copyProperties方法将UserDTO的属性复制到User中,最后,输出了Userusername属性,它现在包含了UserDTO中的值。

ReflectionUtils

主要功能

ReflectionUtils 是 Spring Framework 中的一个实用工具类,用于简化 Java 反射 API 的使用,该类提供了一系列静态方法,允许开发者执行与反射相关的常见任务,而无需编写冗长的反射代码,不过需要注意的是,ReflectionUtils 类并不直接涉及参数校验,它更多地是用于访问和修改对象的字段、调用方法等,主要的功能包括:

  1. 访问字段ReflectionUtils 可以获取类的字段(Field),并读取或设置字段的值,即使它们是私有的。
  2. 调用方法:它允许调用对象的任意方法,包括私有方法。
  3. 查找方法:可以查找类或其父类中的特定方法。
  4. 处理异常:将反射操作中抛出的异常包装为 Spring 的 IllegalArgumentException,使得异常处理更加统一。
  5. 其他实用功能:如判断方法是否存在、获取方法参数类型等。

它特别适合在以下场景场景:

  1. 框架内部实现:Spring 框架在内部大量使用 ReflectionUtils 来实现依赖注入、AOP 等功能。
  2. 动态扩展:在需要动态访问或修改类成员时,可以使用 ReflectionUtils 来避免硬编码。
  3. 测试:在单元测试中,可能需要访问或修改私有字段或方法,ReflectionUtils 可以提供帮助。

代码案例

通常利用ReflectionUtils来访问和修改字段,下面是一些使用 ReflectionUtils 的示例,如下代码:

import org.springframework.util.ReflectionUtils;  
import java.lang.reflect.Field;  public class User {  private String name;  private int age;  // Getters and setters...  public static void main(String[] args) {  User user = new User();  user.setName("John");  // 获取User类的name字段  Field nameField = ReflectionUtils.findField(User.class, "name");  ReflectionUtils.makeAccessible(nameField); // 确保可以访问私有字段  // 读取字段值  String nameValue = (String) ReflectionUtils.getField(nameField, user);  System.out.println("Name: " + nameValue); // 输出 "Name: John"  // 修改字段值  ReflectionUtils.setField(nameField, user, "Jane");  System.out.println("Updated Name: " + user.getName()); // 假设有getter,应输出 "Updated Name: Jane"  }  // 注意:User类应添加对应的getter和setter方法以使示例完整。  
}import org.springframework.util.ReflectionUtils;  
import java.lang.reflect.Method;  public class Calculator {  public int add(int a, int b) {  return a + b;  }  public static void main(String[] args) {  Calculator calculator = new Calculator();  // 获取add方法  Method addMethod = ReflectionUtils.findMethod(Calculator.class, "add", int.class, int.class);  // 调用方法  Object result = ReflectionUtils.invokeMethod(addMethod, calculator, 1, 2);  System.out.println("Result: " + result); // 输出 "Result: 3"  }  
}

注意,由于反射会绕过正常的访问控制,使用它时应特别小心,以确保不会破坏对象的封装性。

在实际应用中,ReflectionUtils 通常应用在框架内部或者编写一些基础组件,而不是在业务逻辑中直接使用。如果业务代码中有大量反射操作,建议封装为工具类以提高代码可读性和可维护性。

Base64Utils

主要功能

Base64Utils类是一个用于处理Base64编码和解码的工具类,Base64编码是一种将二进制数据转换为ASCII字符串的编码方案,常用于在HTTP协议等文本协议中传输二进制数据,Spring Framework提供的Base64Utils类提供了一系列静态方法,用于方便地进行Base64编码和解码操作,主要的功能包括:

  1. encodeToString(byte[] src): 将字节数组编码为 Base64 格式的字符串。
  2. decodeFromString(String src): 将 Base64 格式的字符串解码为字节数组。

它特别适合在以下场景场景:

  1. 在 Web 应用程序中,将文件或图像数据编码为 Base64 字符串,以便通过 HTTP 协议传输。
  2. 在配置文件中存储二进制数据,如加密密钥或证书。
  3. 在需要将二进制数据嵌入到 JSON 或 XML 文档中时。

代码案例

下面是一个使用 Base64Utils 进行编码和解码的简单示例:

import org.springframework.util.Base64Utils;  public class Base64Example {  public static void main(String[] args) {  // 原始字符串  String originalInput = "Hello, World!";  // 编码为 Base64  byte[] encodedBytes = Base64Utils.encode(originalInput.getBytes());  String encodedString = new String(encodedBytes);  System.out.println("Encoded String: " + encodedString);  // 解码 Base64  byte[] decodedBytes = Base64Utils.decode(encodedString.getBytes());  String decodedString = new String(decodedBytes);  System.out.println("Decoded String: " + decodedString);  }  
}

SerializationUtils

主要功能

SerializationUtils提供了Java对象序列化和反序列化的便捷方法,这里的序列化指的是将对象转换为字节流,以便可以将其写入持久存储、通过网络发送或用于其他需要对象二进制表示形式的场景,反序列化则是将字节流转换回原始对象的过程,SerializationUtils类的主要功能包括:

  1. 序列化:将Java对象转换为字节数组。
  2. 反序列化:将字节数组转换回Java对象。

它特别适合在以下场景场景:

  1. 当需要将对象的状态保存到文件中,或者在网络上进行传输时,可以使用SerializationUtils进行序列化和反序列化。
  2. 在分布式系统中,不同节点之间可能需要交换对象,这时序列化和反序列化也是必不可少的。
  3. 在Spring应用中,SerializationUtils还常用于远程方法调用(RMI)、消息传递(如JMS)等场景。

SerializationUtils使用的是Java的标准序列化机制,因此被序列化的类需要实现Serializable接口,此外,Java序列化有一些已知的性能和安全性问题,因此在选择序列化方案时应该谨慎考虑。

代码案例

下面是如何使用SerializationUtils进行序列化和反序列化的代码示例,如下代码:

import org.springframework.util.SerializationUtils;  public class SerializationUtilsExample {  public static void main(String[] args) {  // 创建一个需要序列化的对象  MyObject myObject = new MyObject();  myObject.setId(1);  myObject.setName("Test Object");  // 使用SerializationUtils进行序列化  byte[] serializedBytes = SerializationUtils.serialize(myObject);  // 假设需要将serializedBytes保存到文件或发送到网络...  // 现在进行反序列化  MyObject deserializedObject = SerializationUtils.deserialize(serializedBytes);  // 输出反序列化后的对象状态以验证  System.out.println("Deserialized Object ID: " + deserializedObject.getId());  System.out.println("Deserialized Object Name: " + deserializedObject.getName());  }  // MyObject类需要实现Serializable接口  static class MyObject implements java.io.Serializable {  private int id;  private String name;  // 省略构造器、getter和setter方法  public int getId() {  return id;  }  public void setId(int id) {  this.id = id;  }  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  }  
}

在这个示例中,创建了一个简单的MyObject类,它实现了Serializable接口,然后,使用SerializationUtils.serialize()方法将MyObject实例序列化为字节数组,并使用SerializationUtils.deserialize()方法将字节数组反序列化为MyObject实例。

HttpStatus

主要功能

HttpStatus类是一个枚举类型,它表示HTTP协议中定义的状态码,每一个HTTP请求和响应都会包含一个状态码,用来表明请求或响应的处理结果,HttpStatus类提供了对这些状态码的封装,以便在Spring应用中更方便地使用它们,主要功能包括:

  1. HttpStatus类为所有有效的HTTP状态码提供了常量表示。
  2. 提供了获取状态码对应的数值和原因短语(Reason Phrase)的方法。
  3. 可以用于Spring MVC的控制器方法中,指定响应的HTTP状态码。
  4. 还可以用于Spring的异常处理机制中,将异常映射为特定的HTTP状态码。

它特别适合在以下场景场景:

  1. 在RESTful API中,经常需要返回特定的HTTP状态码来表示操作的结果,比如,创建资源成功时返回201(CREATED),资源未找到时返回404(NOT FOUND)等。
  2. 在Spring MVC的控制器中,可以使用@ResponseStatus注解将异常映射为HTTP状态码,以便客户端能够根据状态码来判断请求的处理情况。
  3. 在Spring Security中,认证和授权失败时,通常会返回特定的HTTP状态码,如401(UNAUTHORIZED)或403(FORBIDDEN)。

HtmlUtils

主要功能

HtmlUtils主要用于处理HTML相关的任务,比如HTML转义和非转义操作,它的目的是帮助开发者在处理用户输入或输出到浏览器时,防止潜在的跨站脚本攻击(XSS),它提供的主要功能有:

  1. HTML转义(Escaping):将HTML特殊字符(如<, >, &, ", ')转换为对应的HTML实体,这样当这些数据被包含在HTML文档中被浏览器渲染时,它们会被安全地显示,而不是被当作HTML代码执行。
  2. HTML非转义(Unescaping):将转义后的HTML实体转换回它们对应的字符,这在处理已经转义的数据并希望恢复其原始形式时非常有用。

HtmlUtils类中用于HTML转义和非转义的主要方法:

  1. htmlEscape(String input):将输入的字符串中的特殊字符进行HTML转义。
  2. htmlUnescape(String input):将输入的字符串中的HTML实体进行非转义。

它特别适合在以下场景场景:

  1. 当在Web应用程序中展示用户提交的数据时,为了防止XSS攻击,需要对用户输入进行HTML转义。
  2. 当从外部源获取已转义的HTML并希望在应用程序中显示原始内容时,可能需要进行HTML非转义。

代码案例

下面是一个简单的代码示例,演示了如何使用HtmlUtils类进行HTML转义和非转义,如下代码:

import org.springframework.web.util.HtmlUtils;  public class HtmlUtilsExample {  public static void main(String[] args) {  // 原始字符串,包含HTML特殊字符  String originalString = "<script>alert('XSS');</script>Hello & World!";  // 对字符串进行HTML转义  String escapedString = HtmlUtils.htmlEscape(originalString);  System.out.println("Escaped String: " + escapedString);  // 输出: &lt;script&gt;alert('XSS');&lt;/script&gt;Hello &amp; World!  // 对转义后的字符串进行HTML非转义  String unescapedString = HtmlUtils.htmlUnescape(escapedString);  System.out.println("Unescaped String: " + unescapedString);  // 输出: <script>alert('XSS');</script>Hello & World!  // 注意:在实际场景中,通常不会对非自己转义的字符串进行非转义操作,  // 因为这可能带来安全风险。上面的非转义操作仅用于演示目的。  }  
}

关注我,每天学习互联网编程技术 - 程序员古德

END!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转融通业务是什么?好处和弊端是什么?

转融通业务是指证券金融公司借入证券、筹得资金后&#xff0c;再转借给证券公司&#xff0c;为证券公司开展融资融券业务提供资金和证券来源&#xff0c;包括转融券业务和转融资业务两部分。从证券金融公司角度看&#xff0c;向证券公司提供资金和证券供其开展融资融券业务&…

Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

一、概述 ① 缓存穿透&#xff1a;大量请求根本不存在的key&#xff08;下文详解&#xff09; ② 缓存雪崩&#xff1a;redis中大量key集体过期&#xff08;下文详解&#xff09; ③ 缓存击穿&#xff1a;redis中一个热点key过期&#xff08;大量用户访问该热点key&#xff0c;…

Unity类银河恶魔城学习记录3-2 Entity源代码 P48

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic;…

【学习笔记】树上差分总结(点差分/边差分)

一.树上差分的基本概念 1.树上差分的定义 树上差分&#xff0c;顾名思义&#xff0c;意思就是在树上做差分。 至于什么是差分呢&#xff1f;如果不会的同学&#xff0c;可以先看看我的这篇博客:一维,二维差分の详解&#xff08;简单易懂&#xff09;_一维差分-CSDN博客 2.树…

SpringBoot中使用Spring自带线程池ThreadPoolTaskExecutor与Java8CompletableFuture实现异步任务示例

场景 关于线程池的使用&#xff1a; Java中ExecutorService线程池的使用(Runnable和Callable多线程实现)&#xff1a; Java中ExecutorService线程池的使用(Runnable和Callable多线程实现)_executorservice executorservice executors.newfix-CSDN博客 Java中创建线程的方式…

React+echarts实现排名+自动滚动+X轴自定义titleTop

1、效果 2、环境准备 1、react18 2、antd 4 3、代码实现 原理&#xff1a;自动滚动通过创建定时器动态更新echar的dataZoom属性startValue、endValue&#xff0c;自定义tooltip通过监听echar的鼠标移入移出事件&#xff0c;判断tooltTip元素的显隐以及位置。 /*** 收集完成…

【Java EE】----Spring框架创建和使用

1.Spring框架创建 创建一个maven项目 添加Spring框架支持 <dependencies> 上下文<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></depende…

【网站项目】038汽车养护管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

PS之外的平面设计利器:7款高效软件帮你轻松搞定

平面图设计的痕迹体现在日常生活的方方面面&#xff0c;如路边传单、杂志、产品包装袋或手机开屏海报等&#xff0c;平面设计软件层出不穷。Photoshop是大多数平面图设计初学者的入门软件&#xff0c;但随着设计师需求的不断提高&#xff0c;平面图设计软件Photoshop逐渐显示出…

SpringBoot:自动配置报告

自动配置报告demo&#xff1a;点击查看 LearnSpringBoot03AutoConfig 点击查看更多的SpringBoot教程 一、application.properties代码 #开启springboot debug模式 #自动配置报告 #Positive matches: 自动配置类启用了&#xff08;自动配置类匹配上了&#xff09;&#xff0c…

【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费

作者推荐 【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II 本文涉及知识点 动态规划汇总 LeetCode1928. 规定时间内到达终点的最小花费 一个国家有 n 个城市&#xff0c;城市编号为 0 到 n - 1 &#xff0c;题目保证 所有城市 都由双向道路 连接在一起…

【python】绘制春节烟花

一、Pygame库春节烟花示例 下面是一个使用Pygame实现的简单春节烟花效果的示例代码。请注意&#xff0c;运行下面的代码之前&#xff0c;请确保计算机上已经安装了Pygame库。 import pygame import random import math from pygame.locals import *# 初始化pygame pygame.ini…

如何让 Pages 文字分为两栏或更多栏?

通常一份文件都是由上往下仅有「一栏」而已&#xff0c;但在某些情况的排版&#xff0c;我们需要两栏甚至三栏的设计&#xff0c;在Pages 要如何做到呢&#xff1f;来看看吧。 将 Pages 文件改为双栏式设计 点一下「格式」>「布局」&#xff0c;就可以看到预设的「直栏」数…

LeetCode-第2469题=温度转换

1.题目描述 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以数组 ans …

【AI数字人-论文】GeneFace++

文章目录 前言pipelinePitch-Aware Audio-to-MotionLandmark LLELLELandmark LLE Instant motion-to-video rendering结果对比 前言 为了提高预测的面部关键点序列的长期时间一致性和自然度&#xff0c;我们提出了一个Pitch-Aware Audio-to-Motion音高感知的音频到动作模块。具…

Spring是怎么解决循环依赖的

首先先解释一下什么叫循环依赖 循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于A 循环依赖在spring中是允许存在的,spring框架依据三级缓存已经解决了大部分的循环依赖 一级缓存:单例池,缓存已经经历了完整的…

时序预测 | MATLAB实现基于CNN-LSTM-AdaBoost卷积长短期记忆网络结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于CNN-LSTM-AdaBoost卷积长短期记忆网络结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于CNN-LSTM-AdaBoost卷积长短期记忆网络结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-LST…

vue3 之 商城项目—layout静态模版结构搭建

layout—模块静态模版搭建 一般情况下我们会有nav区域&#xff0c;header区域&#xff0c;二级路由出口区域以及footer区域&#xff0c;如图 我们在开发的时候先把大模块搭建起来&#xff0c;再一步一步填充小模块 在layout下建文件&#xff0c;目录如下 在index.vue中把上…

基于springboot+vue+mysql员工宿舍管理系统

技术栈 jdk8springboot vueelement-plusMySQL 包含功能点 管理员端 登录员工管理宿舍管理留言板管理物品报修管理公告管理 员工端 登录首页个人中心物品报修留言板 功能截图(部分) 管理员 管理员登录 员工管理 宿舍管理 物品报修管理 公告管理 留言管理 员工 员工登录…

数据库管理-第145期 最强Oracle监控EMCC深入使用-02(20240205)

数据库管理145期 2024-02-05 数据库管理-第145期 最强Oracle监控EMCC深入使用-02&#xff08;20240205&#xff09;1 监控方式2 度量配置3 阻塞4 DG监控总结 数据库管理-第145期 最强Oracle监控EMCC深入使用-02&#xff08;20240205&#xff09; 作者&#xff1a;胖头鱼的鱼缸&…