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

博主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,我们可以确保只有受信任的类可以被反序列化,从而提高系统的安全性。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-07 12:32:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-07 12:32:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-07 12:32:03       87 阅读
  4. Python语言-面向对象

    2024-02-07 12:32:03       96 阅读

热门阅读

  1. 87.Go Redis实现可重入、自动续期分布式锁

    2024-02-07 12:32:03       60 阅读
  2. Makefile 和 Bash 脚本之间区别和联系

    2024-02-07 12:32:03       51 阅读
  3. Python面试题1-6

    2024-02-07 12:32:03       46 阅读
  4. Bug地狱 #1 突然宕机,企业级应用到底怎么了

    2024-02-07 12:32:03       53 阅读
  5. home work day5

    2024-02-07 12:32:03       52 阅读
  6. 2024/2/6

    2024-02-07 12:32:03       49 阅读
  7. 计算机网络相关题目及答案(第四章)

    2024-02-07 12:32:03       56 阅读
  8. win11安装mysql8.3.0压缩包版 240206

    2024-02-07 12:32:03       55 阅读
  9. 拼音笔记笔记

    2024-02-07 12:32:03       52 阅读
  10. 什么是大模型

    2024-02-07 12:32:03       47 阅读
  11. #P12365. 相逢是首歌

    2024-02-07 12:32:03       44 阅读
  12. SQL--DQL

    SQL--DQL

    2024-02-07 12:32:03      39 阅读