博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程
一、java.io
1.40 ObjectInputFilter
ObjectInputFilter
是 Java 9 引入的新接口,用于提供更强大的对象输入过滤器机制,以增强对象输入流的安全性。它允许在反序列化对象时进行自定义过滤和验证。以下是关于 ObjectInputFilter
的基本介绍:
ObjectInputFilter
介绍:
所有字段:
-
无特定字段。
构造方法:
-
由于是接口,因此没有构造方法。
方法摘要:
-
Status checkInput(FilterInfo filterInfo)
: 用于检查输入的对象是否满足过滤条件。
简单使用例子:
javaCopy code import java.io.*; public class ObjectInputFilterExample { public static void main(String[] args) { String fileName = "data.bin"; // 模拟从文件加载对象,并应用过滤器 loadObjectWithFilter(fileName); } private static void loadObjectWithFilter(String fileName) { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { // 设置对象输入过滤器 ObjectInputFilter filter = MyObjectInputFilter.create(); ObjectInputFilter.Config.setSerialFilter(filter); // 读取对象 Object object = inputStream.readObject(); if (object instanceof MyClass) { MyClass myObject = (MyClass) object; System.out.println("Loaded object: " + myObject); } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } static class MyClass implements Serializable { private String data; public MyClass(String data) { this.data = data; } @Override public String toString() { return "MyClass{" + "data='" + data + '\'' + '}'; } } static class MyObjectInputFilter implements ObjectInputFilter { private static final long serialVersionUID = 1L; // 创建自定义过滤器 public static ObjectInputFilter create() { return new MyObjectInputFilter(); } @Override public Status checkInput(FilterInfo filterInfo) { // 自定义过滤逻辑 // 此处示例允许所有类的反序列化 return Status.ALLOWED; } } }
在这个例子中,我们使用 ObjectInputStream
从文件中读取一个对象,并应用了自定义的 ObjectInputFilter
。在 MyObjectInputFilter
中,我们实现了 ObjectInputFilter
接口,并在 checkInput
方法中定义了自己的过滤逻辑。这个例子中的过滤器允许所有类的反序列化,但在实际项目中,你可能需要根据具体的安全要求定义更复杂的过滤规则。
请注意,ObjectInputFilter
是 Java 9 引入的新特性,如果你的项目使用的是 Java 8 或更早版本,将无法使用此功能。
应用场景
ObjectInputFilter
的主要用途是提供对反序列化对象的安全过滤机制。以下是一些可能的应用场景及相应的代码实现:
应用场景 1: 简单的对象过滤
javaCopy code import java.io.*; public class SimpleObjectFilterExample { public static void main(String[] args) { String fileName = "data.bin"; // 模拟从文件加载对象,并应用过滤器 loadObjectWithFilter(fileName); } private static void loadObjectWithFilter(String fileName) { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { // 设置对象输入过滤器 ObjectInputFilter filter = MyObjectInputFilter.create(); ObjectInputFilter.Config.setSerialFilter(filter); // 读取对象 Object object = inputStream.readObject(); if (object instanceof MyClass) { MyClass myObject = (MyClass) object; System.out.println("Loaded object: " + myObject); } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } static class MyClass implements Serializable { private String data; public MyClass(String data) { this.data = data; } @Override public String toString() { return "MyClass{" + "data='" + data + '\'' + '}'; } } static class MyObjectInputFilter implements ObjectInputFilter { private static final long serialVersionUID = 1L; // 创建自定义过滤器 public static ObjectInputFilter create() { return new MyObjectInputFilter(); } @Override public Status checkInput(FilterInfo filterInfo) { // 自定义过滤逻辑 // 此处示例允许所有类的反序列化 return Status.ALLOWED; } } }
这个例子演示了一个简单的过滤器,允许所有类的反序列化。在实际应用中,你可能需要根据具体的需求定义更复杂的过滤规则。
应用场景 2: 阻止特定类的反序列化
javaCopy code import java.io.*; public class BlockClassDeserializationExample { public static void main(String[] args) { String fileName = "data.bin"; // 模拟从文件加载对象,并应用过滤器 loadObjectWithFilter(fileName); } private static void loadObjectWithFilter(String fileName) { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { // 设置对象输入过滤器 ObjectInputFilter filter = MyObjectInputFilter.create(); ObjectInputFilter.Config.setSerialFilter(filter); // 读取对象 Object object = inputStream.readObject(); if (object instanceof MyClass) { MyClass myObject = (MyClass) object; System.out.println("Loaded object: " + myObject); } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } static class MyClass implements Serializable { private String data; public MyClass(String data) { this.data = data; } @Override public String toString() { return "MyClass{" + "data='" + data + '\'' + '}'; } } static class MyObjectInputFilter implements ObjectInputFilter { private static final long serialVersionUID = 1L; // 创建自定义过滤器 public static ObjectInputFilter create() { return new MyObjectInputFilter(); } @Override public Status checkInput(FilterInfo filterInfo) { // 自定义过滤逻辑 // 此处示例阻止特定类的反序列化 if ("BlockedClass".equals(filterInfo.serialClass().getName())) { return Status.REJECTED; } return Status.ALLOWED; } } }
这个例子演示了一个过滤器,阻止特定类(例如,类名为 "BlockedClass")的反序列化。在实际应用中,你可能需要根据具体的安全需求定义更复杂的过滤规则。
请注意,这些例子都是为了演示 ObjectInputFilter
的基本用法。在实际项目中,过滤规则应该根据具体的安全需求和业务逻辑来定义。
实战例子
在一个实际项目中,ObjectInputFilter
的使用通常涉及到更为复杂的安全性和业务需求。下面是一个简化的例子,演示了如何在一个简单的用户管理系统中使用 ObjectInputFilter
进行反序列化对象的安全过滤。
项目实战例子:用户管理系统
假设你有一个简单的用户管理系统,需要从文件中加载用户信息。在加载过程中,你希望通过 ObjectInputFilter
实现以下安全性和业务需求:
-
仅允许反序列化
User
类。 -
对反序列化的用户对象进行业务规则验证。
javaCopy code import java.io.*; import java.util.ArrayList; import java.util.List; public class UserManagementSystem { public static void main(String[] args) { String fileName = "user_data.ser"; // 模拟保存用户信息到文件 saveUsersToFile(fileName); // 模拟加载用户信息并展示 loadAndDisplayUsers(fileName); } private static void saveUsersToFile(String fileName) { List<User> users = new ArrayList<>(); users.add(new User("John", 25)); users.add(new User("Alice", 30)); try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) { outputStream.writeObject(users); System.out.println("Users saved to file successfully."); } catch (IOException e) { e.printStackTrace(); } } private static void loadAndDisplayUsers(String fileName) { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { // 设置对象输入过滤器 ObjectInputFilter filter = MyObjectInputFilter.create(); ObjectInputFilter.Config.setSerialFilter(filter); // 读取对象 Object object = inputStream.readObject(); if (object instanceof List) { List<User> loadedUsers = (List<User>) object; // 对加载的用户进行业务规则验证 for (User user : loadedUsers) { if (isValidUser(user)) { System.out.println("Loaded user: " + user); } else { System.out.println("Invalid user: " + user); } } } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } private static boolean isValidUser(User user) { // 在实际应用中,根据业务规则进行用户验证 return user.getAge() >= 18; // 简单示例:年龄大于等于18岁为有效用户 } static class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } static class MyObjectInputFilter implements ObjectInputFilter { private static final long serialVersionUID = 1L; // 创建自定义过滤器 public static ObjectInputFilter create() { return new MyObjectInputFilter(); } @Override public Status checkInput(FilterInfo filterInfo) { // 自定义过滤逻辑 // 仅允许反序列化 User 类 if ("User".equals(filterInfo.serialClass().getName())) { return Status.ALLOWED; } return Status.REJECTED; } } }
在这个例子中,UserManagementSystem
模拟了一个用户管理系统,其中包含了保存和加载用户信息的操作。通过自定义的 ObjectInputFilter
实现,我们设置了过滤器来限制只允许反序列化 User
类。此外,通过在 isValidUser
方法中定义的业务规则验证,我们可以对加载的用户进行进一步的业务规则检查。
请注意,实际项目中,过滤规则和业务规则验证需要根据具体的安全性和业务需求进行定义。