博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程
一、java.io
1.43 ObjectInputFilter.Status
在Java中,ObjectInputFilter.Status
枚举表示对象输入过滤器中的检查结果状态。以下是关于ObjectInputFilter.Status
的基本介绍:
ObjectInputFilter.Status
介绍:
所有字段:
-
ALLOWED
: 表示允许进行当前的反序列化操作。 -
REJECTED
: 表示拒绝进行当前的反序列化操作。
构造方法:
-
private Status() {}
:ObjectInputFilter.Status
枚举类的构造方法为私有,不能被实例化。
方法摘要:
-
valueOf(String name)
: 返回带有指定名称的枚举常量。 -
values()
: 返回枚举类型的常量数组。
简单使用例子:
javaCopy code public class ObjectInputFilterExample { public static void main(String[] args) {// 使用枚举常量ObjectInputFilter.Status status = ObjectInputFilter.Status.ALLOWED;System.out.println("Status: " + status); // 使用valueOf()方法获取枚举常量ObjectInputFilter.Status status1 = ObjectInputFilter.Status.valueOf("ALLOWED");System.out.println("Status 1: " + status1); // 使用values()方法获取所有枚举常量ObjectInputFilter.Status[] statuses = ObjectInputFilter.Status.values();System.out.println("All Statuses:");for (ObjectInputFilter.Status s : statuses) {System.out.println(s);}} }
在这个简单的例子中,我们展示了如何使用ObjectInputFilter.Status
枚举。我们创建了一个枚举常量ALLOWED
并打印了其值。然后,我们使用valueOf()
方法根据枚举常量的名称获取枚举常量,并使用values()
方法获取所有枚举常量。
应用例子
ObjectInputFilter.Status
枚举通常用于在对象输入过滤器中指示当前反序列化操作的状态。以下是一些可能的应用场景和相应的代码实现示例:
应用场景 1: 根据状态执行不同的操作
javaCopy code import java.io.*; public class StatusUsageExample { public static void main(String[] args) {try {// 模拟检查反序列化对象的状态ObjectInputFilter.Status status = getStatusFromExternalSource(); // 根据状态执行不同的操作switch (status) {case ALLOWED:// 允许进行当前的反序列化操作performDeserialization();break;case REJECTED:// 拒绝进行当前的反序列化操作handleRejectedDeserialization();break;default:// 处理其他状态handleUnknownStatus();}} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}} private static ObjectInputFilter.Status getStatusFromExternalSource() {// 从外部获取反序列化对象的状态,这里简单地返回一个模拟的状态return Math.random() < 0.5 ? ObjectInputFilter.Status.ALLOWED : ObjectInputFilter.Status.REJECTED;} private static void performDeserialization() throws IOException, ClassNotFoundException {// 在此执行允许的反序列化操作System.out.println("Performing deserialization...");try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("data.ser"))) {Object object = inputStream.readObject();System.out.println("Deserialized object: " + object);}} private static void handleRejectedDeserialization() {// 在此处理被拒绝的反序列化操作System.out.println("Handling rejected deserialization...");System.out.println("Access to deserialization is denied.");} private static void handleUnknownStatus() {// 在此处理未知的状态System.out.println("Unknown status. Cannot proceed with deserialization.");} }
应用场景 2: 在自定义的对象输入过滤器中使用
javaCopy code import java.io.*; public class CustomObjectInputFilterUsage { public static void main(String[] args) {try {// 设置自定义的对象输入过滤器ObjectInputFilter filter = new MyObjectInputFilter();ObjectInputFilter.Config.setSerialFilter(filter); // 模拟反序列化操作performDeserialization();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}} private static void performDeserialization() throws IOException, ClassNotFoundException {// 在此执行允许的反序列化操作System.out.println("Performing deserialization...");try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("data.ser"))) {Object object = inputStream.readObject();System.out.println("Deserialized object: " + object);}} static class MyObjectInputFilter implements ObjectInputFilter {private static final long serialVersionUID = 1L; @Overridepublic Status checkInput(FilterInfo filterInfo) {// 模拟根据某些条件检查反序列化操作的状态if (filterInfo.serialClass().getName().equals("MyClass")) {// 允许特定类的反序列化操作return Status.ALLOWED;} else {// 拒绝其他类的反序列化操作return Status.REJECTED;}}} }
以上示例展示了如何在不同场景下使用ObjectInputFilter.Status
枚举。在第一个示例中,我们根据状态执行不同的操作,以模拟根据状态来决定应该如何处理反序列化操作。在第二个示例中,我们定义了一个自定义的对象输入过滤器,并在其中使用了ObjectInputFilter.Status
来指示允许或拒绝反序列化操作。
实战例子
以下是一个项目实战的例子,涉及使用ObjectInputFilter.Status
来设置全局的对象输入过滤器,以确保只有受信任的类可以被反序列化。
javaCopy code import java.io.*; public class SecureDeserializationProject { public static void main(String[] args) {// 保存数据到文件saveDataToFile("data.ser"); // 从文件加载数据并进行反序列化loadDataFromFile("data.ser");} private static void saveDataToFile(String fileName) {try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {// 创建一个可信的类对象并保存到文件TrustedClass trustedObject = new TrustedClass("Important 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();} @Overridepublic Status checkInput(FilterInfo filterInfo) {// 仅允许反序列化 TrustedClass 类if ("TrustedClass".equals(filterInfo.serialClass().getName())) {return Status.ALLOWED;}// 其他类都拒绝return Status.REJECTED;}} }
在这个示例中,我们创建了一个TrustedClass
类作为受信任的类,并将其保存到文件中。然后,我们设置了一个全局的对象输入过滤器,仅允许反序列化TrustedClass
类,以确保只有受信任的类可以被反序列化。通过使用ObjectInputFilter.Status
和自定义的ObjectInputFilter
,我们可以提高系统的安全性,防止反序列化不受信任的类。