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.rhkb.cn/news/252781.html

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

相关文章

LLM(大语言模型)——大模型简介

目录 概述 发展历程 大语言模型的概念 LLM的应用和影响 大模型的能力、特点 大模型的能力 涌现能力&#xff08;energent abilities&#xff09; 作为基座模型支持多元应用的能力 支持对话作为统一入口的能力 大模型的特点 常见大模型 闭源LLM&#xff08;未公开源…

uni-app 经验分享,从入门到离职(三)——关于 uni-app 生命周期快速了解上手

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;什么是生命周期&#x1f9e9;应用生命周期&#x1f4cc; 关于 App.vue/App.uvue &#x1f9e9;页面生命周期&#x1f4cc;关于 onShow 与 onLoad 的区别 &#x1f9e9;组件生命周期 &#x1f4dd;最后 &#x1f4cb;前言 这…

北朝隋唐文物展亮相广西,文物预防性保护网关保驾护航

一、霸府名都——太原博物馆收藏北朝隋朝文物展 2月1日&#xff0c;广西民族博物馆与太原博物馆携手&#xff0c;盛大开启“霸府名都——太原博物馆北朝隋文物展”。此次新春展览精选了北朝隋唐时期150多件晋阳文物珍品。依据“巍巍雄镇”“惊世古冢”“锦绣名都”三个单元&am…

Web3行业研究逐步加强,“链上数据”缘何成为关注焦点?

据中国电子报报道&#xff0c;近日&#xff0c;由中关村区块链产业联盟指导&#xff0c;中国信息通信研究院牵头&#xff0c;欧科云链控股有限公司参与编写的《全球Web3产业全景与发展趋势研究报告&#xff08;2023年&#xff09;》正式发布。研究报告通过全面追踪国内外Web3产…

图论练习2

内容&#xff1a;路径计数DP&#xff0c;差分约束 最短路计数 题目大意 给一个个点条边的无向无权图&#xff0c;问从出发到其他每个点的最短路有多少条有自环和重边&#xff0c;对答案 解题思路 设边权为1&#xff0c;跑最短路 表示的路径数自环和重边不影…

[office] 怎么样在excel中插入虚线圆圈 #学习方法#微信#知识分享

怎么样在excel中插入虚线圆圈 Excel中可以插入圆形&#xff0c;然后将边框设置为虚线&#xff0c;从而得到虚线圆。 软件版本&#xff1a;Office2007 方法如下&#xff1a; 1.点击插入菜单中的形状&#xff0c;选择椭圆&#xff1a; 2.按下Shift键&#xff0c;同时拖动鼠标…

国产航顺HK32F030M: 超声波测距模块串口通信数据接收与处理

参考代码 /************************************************************************************************** * file usart_async_tx_no_int_rx_rxneint.c * brief 异步串口通信例程, 通过查询TXE标志发送数据,通过RXNE中断接收数据,当中断接收到数据后会将 * …

STL算法(中)

常用排序算法 sort 功能描述&#xff1a; 对容器内元素进行排序 函数原型&#xff1a; sort(iterator beg, iterator end, _Pred) ; // 按值查找元素&#xff0c;找到返回指定位置迭代器&#xff0c;找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 …

感悟笔记——2024年2月5日

今日阅读了一篇挺有深度的文章&#xff0c;主要阐述进入职场后的大部分人&#xff0c;是怎么逐渐沦为螺丝钉的?即使起点巨高的优等生&#xff0c;也不可避免。文章指路&#xff1a; 「优等生思维」正在将你变成「螺丝钉」和「老黄牛」从小到大&#xff0c;我一直都是那个「别…

2024最新版MySQL安装使用指南

2024最新版MySQL安装使用指南 Installation and Usage Guide to the Latest Oracle MySQL in 2024 By JacksonML 1. MySQL简介 MySQL是世界上最受欢迎的开源数据库之一。MySQL属于Oracle&#xff08;甲骨文&#xff09;公司的产品&#xff0c;其具有强大的功能&#xff0c;但…

【QT】opcuaServer 的构建

【QT】opcuaServer 的构建 前言opcuaServer实现测试 前言 在博文【opcua】从编译文件到客户端的收发、断连、节点查询等实现 中&#xff0c;我们已经介绍了如何在QT 中创建opucaClient 。在本期的博文中&#xff0c;我们基于之前的部署环境&#xff0c;介绍一下如何构建opcuaS…

对AI原生应用做“逆向”后,我找到了大多数大模型厂商注定失败的原因

大家好&#xff0c;我是卖萌酱。 在一整个2023年对大模型风风火火的流星赶月之后&#xff0c;大模型的竞逐已经来到了“下半场”。应接不暇推出一个又一个大模型已为GPT的技术神话祛魅&#xff0c;不得不说&#xff0c;2024年的大模型市场将更加关注大模型的应用和商业价值。 …

docker入门教程之将应用程序容器化

将应用程序容器化 在本指南的其余部分中&#xff0c;您将使用在 Node.js 上运行的简单待办事项列表管理器。如果您不熟悉 Node.js&#xff0c;请不要担心。本指南不需要任何 JavaScript 经验。 先决条件 您已安装最新版本的 Docker Desktop。您已经安装了 Git 客户端。您可以…

88 SRC挖掘-拿下CNVD证书开源闭源售卖系统

目录 1&#xff0e;开源系统、闭源系统、售卖系统2&#xff0e;如何寻找上述三类系统并进行安全测试3&#xff0e;如何挑简单的入手最快速度获取证书装x演示案例:某开源逻辑审计配合引擎实现通用某闭源审计或黑盒配合引擎实现通用某售卖审计或黑盒配合引擎实现通用 涉及资源&am…

10s初认识多线程创建四种方法

1 继承Thread类 2 实现Runnable接口 3 实现Callable接口 4 多线程池 1-2两方法 10s学会教程网址&#xff1a; http://t.csdnimg.cn/UPy1r 本文简略提及多线程池 -》提前创建多个线程&#xff0c;放在一个“容器”&#xff0c;用时取出&#xff0c;不用即放回池中 优点-》响应…

博客|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)

个人博客系统目录 目录 基于Springboot的个人博客系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;用户管理 &#xff08;2&#xff09;文章分类管理 &#xff08;3&#xff09;公告信息管理 &#xff08;4&#…

MySQL查询优化技巧和10个案例展示

优化MySQL查询的实战技巧&#xff1a; **避免使用SELECT ***&#xff1a;只获取需要的列&#xff0c;这样可以减少数据传输量&#xff0c;提高查询效率。使用索引&#xff1a;为查询频繁的列创建索引&#xff0c;可以显著提高查询速度。但请注意&#xff0c;索引并非万能&…

AI新宠Arc浏览器真可以取代Chrome吗?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

缩略图保持加密(TPE)论文

文献: R.Zhao,Y.Zhang,Y.Nan,W.Wen,X.Chai,andR. Lan, “Primitively visually meaningful image encryption: A new paradigm,” Inf. Sci. (Ny), Vol. 613, pp. 628–48, 2022. DOI: 10.1016/j.ins.2022.08.027. (1) 第1行:原始图像 第2行:加密图像 加密的目标: 原始…

MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(1)-后端项目框架搭建

前言&#xff1a; 前面的四个章节我们主要讲解了MongoDB的相关基础知识&#xff0c;接下来我们就开始进入使用.NET7操作MongoDB开发一个ToDoList系统实战教程。本章节主要介绍的是如何快熟搭建一个简单明了的后端项目框架。 MongoDB从入门到实战的相关教程 MongoDB从入门到实战…