博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程

(每日持续更新)jdk api之ObjectInputFilter.Status基础、应用、实战-LMLPHP

一、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;
​
        @Override
        public 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();
        }
​
        @Override
        public Status checkInput(FilterInfo filterInfo) {
            // 仅允许反序列化 TrustedClass 类
            if ("TrustedClass".equals(filterInfo.serialClass().getName())) {
                return Status.ALLOWED;
            }
            // 其他类都拒绝
            return Status.REJECTED;
        }
    }
}

在这个示例中,我们创建了一个TrustedClass类作为受信任的类,并将其保存到文件中。然后,我们设置了一个全局的对象输入过滤器,仅允许反序列化TrustedClass类,以确保只有受信任的类可以被反序列化。通过使用ObjectInputFilter.Status和自定义的ObjectInputFilter,我们可以提高系统的安全性,防止反序列化不受信任的类。

02-09 20:58