博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程
一、java.io
1.42 ObjectInputFilter.FilterInfo
在Java 17中,ObjectInputFilter.FilterInfo
类提供了有关正在尝试进行的反序列化操作的信息。下面是关于ObjectInputFilter.FilterInfo
的基本介绍:
ObjectInputFilter.FilterInfo
介绍:
所有字段:
-
serialClass
: 表示正在尝试反序列化的类的描述符。
构造方法:
-
FilterInfo(Class<?> serialClass):
使用给定的序列化类描述符创建FilterInfo
对象。
方法摘要:
-
serialClass()
: 返回正在尝试反序列化的类的描述符。
简单使用例子:
下面是一个简单的例子,演示如何使用ObjectInputFilter.FilterInfo
类:
javaCopy code import java.io.*; public class FilterInfoExample { public static void main(String[] args) { try { // 创建一个 FilterInfo 对象 ObjectInputFilter.FilterInfo filterInfo = new ObjectInputFilter.FilterInfo(MyClass.class); // 输出正在尝试反序列化的类的描述符 System.out.println("Serial Class: " + filterInfo.serialClass().getName()); } catch (Exception e) { e.printStackTrace(); } } static class MyClass implements Serializable { private static final long serialVersionUID = 1L; } }
在这个例子中,我们创建了一个ObjectInputFilter.FilterInfo
对象,指定了一个类MyClass
的描述符。然后,我们使用serialClass()
方法获取正在尝试反序列化的类的描述符,并输出其名称。
应用场景
ObjectInputFilter.FilterInfo
类通常用于在设置全局反序列化过滤器时,根据正在尝试进行的反序列化操作的信息来进行过滤。以下是一些可能的应用场景和相应的代码实现:
应用场景 1: 根据反序列化类进行过滤
javaCopy code import java.io.*; public class FilterByClassExample { public static void main(String[] args) { try { // 创建一个 FilterInfo 对象 ObjectInputFilter.FilterInfo filterInfo = new ObjectInputFilter.FilterInfo(MyClass.class); // 根据反序列化类进行过滤 ObjectInputFilter filter = MyObjectInputFilter.create(filterInfo); ObjectInputFilter.Config.setSerialFilter(filter); } catch (Exception e) { e.printStackTrace(); } } static class MyClass implements Serializable { private static final long serialVersionUID = 1L; } static class MyObjectInputFilter implements ObjectInputFilter { private static final long serialVersionUID = 1L; // 创建自定义过滤器 public static ObjectInputFilter create(ObjectInputFilter.FilterInfo filterInfo) { return new MyObjectInputFilter(filterInfo); } private final ObjectInputFilter.FilterInfo filterInfo; private MyObjectInputFilter(ObjectInputFilter.FilterInfo filterInfo) { this.filterInfo = filterInfo; } @Override public Status checkInput(FilterInfo filterInfo) { // 根据反序列化类进行过滤 if (this.filterInfo.serialClass().equals(filterInfo.serialClass())) { return Status.ALLOWED; } return Status.REJECTED; } } }
应用场景 2: 根据反序列化类的特定属性进行过滤
javaCopy code import java.io.*; public class FilterByClassAttributeExample { public static void main(String[] args) { try { // 创建一个 FilterInfo 对象 ObjectInputFilter.FilterInfo filterInfo = new ObjectInputFilter.FilterInfo(MyClass.class); // 根据反序列化类的特定属性进行过滤 ObjectInputFilter filter = MyObjectInputFilter.create(filterInfo); ObjectInputFilter.Config.setSerialFilter(filter); } catch (Exception e) { e.printStackTrace(); } } static class MyClass implements Serializable { private static final long serialVersionUID = 1L; private final String attribute; public MyClass(String attribute) { this.attribute = attribute; } public String getAttribute() { return attribute; } } static class MyObjectInputFilter implements ObjectInputFilter { private static final long serialVersionUID = 1L; // 创建自定义过滤器 public static ObjectInputFilter create(ObjectInputFilter.FilterInfo filterInfo) { return new MyObjectInputFilter(filterInfo); } private final ObjectInputFilter.FilterInfo filterInfo; private MyObjectInputFilter(ObjectInputFilter.FilterInfo filterInfo) { this.filterInfo = filterInfo; } @Override public Status checkInput(FilterInfo filterInfo) { // 根据反序列化类的特定属性进行过滤 if (this.filterInfo.serialClass().equals(filterInfo.serialClass())) { MyClass myClass = (MyClass) filterInfo.serialClass(); if ("desiredValue".equals(myClass.getAttribute())) { return Status.ALLOWED; } } return Status.REJECTED; } } }
这些例子演示了如何根据ObjectInputFilter.FilterInfo
对象中的信息,例如正在尝试进行的反序列化操作的类,来设置全局反序列化过滤器,从而根据特定需求进行对象反序列化的过滤。在实际应用中,过滤规则应该根据具体的安全需求和业务逻辑来定义。
实战例子
以下是一个项目实战示例,其中使用了ObjectInputFilter.FilterInfo
和自定义的ObjectInputFilter
来设置全局反序列化过滤器,以确保只有受信任的类可以被反序列化,从而增强系统的安全性。
javaCopy code import java.io.*; import java.util.*; public class SecureObjectDeserialization { public static void main(String[] args) { String fileName = "data.ser"; // 模拟保存数据到文件 saveDataToFile(fileName); // 模拟从文件加载数据并进行反序列化 loadDataFromFile(fileName); } private static void saveDataToFile(String fileName) { try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) { // 创建一些可信的对象 TrustedClass trustedObject = new TrustedClass("Trusted Data"); // 将对象保存到文件 outputStream.writeObject(trustedObject); System.out.println("Trusted object saved to file successfully."); } catch (IOException e) { e.printStackTrace(); } } private static void loadDataFromFile(String fileName) { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { // 设置全局对象输入过滤器,仅允许反序列化 TrustedClass 类 ObjectInputFilter filter = TrustedObjectInputFilter.create(); ObjectInputFilter.Config.setSerialFilter(filter); // 读取对象 Object object = inputStream.readObject(); if (object instanceof TrustedClass) { TrustedClass trustedObject = (TrustedClass) object; System.out.println("Loaded trusted object: " + trustedObject.getData()); } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } static class TrustedClass implements Serializable { private static final long serialVersionUID = 1L; private String data; public TrustedClass(String data) { this.data = data; } public String getData() { return data; } } static class TrustedObjectInputFilter implements ObjectInputFilter { private static final long serialVersionUID = 1L; // 创建自定义过滤器 public static ObjectInputFilter create() { return new TrustedObjectInputFilter(); } @Override public Status checkInput(FilterInfo filterInfo) { // 仅允许反序列化 TrustedClass 类 if ("TrustedClass".equals(filterInfo.serialClass().getName())) { return Status.ALLOWED; } // 其他类都拒绝 return Status.REJECTED; } } }
在这个例子中,我们创建了一个TrustedClass
类作为受信任的类,并将其保存到文件中。然后,我们设置了一个全局的对象输入过滤器,仅允许反序列化TrustedClass
类,这样就可以防止反序列化不受信任的类。通过使用ObjectInputFilter.FilterInfo
和自定义的ObjectInputFilter
,我们可以确保只有受信任的类可以被反序列化,从而提高系统的安全性。