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

news2024/11/13 7:51:11

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1437496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabiitMQ延迟队列(死信交换机)

Dead Letter Exchange&#xff08;死信交换机&#xff09; 在MQ中&#xff0c;当消息成为死信&#xff08;Dead message 死掉的信息&#xff09;后&#xff0c;消息中间件可以将其从当前队列发送到另一个队列中&#xff0c;这个队列就是死信队列。而 在RabbitMQ中&#xff0c;由…

dolphinscheduler海豚调度(一)简介快速体验

1、简介 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系&#xff0c;并为应…

Doris中的本地routineload环境,用于开发回归测试用例

----------------2024-2-6-更新-------------- doris的routineload&#xff0c;就是从kafka中加载数据到表&#xff0c;特点是定时、周期性的从kafka取数据。 要想在本地开发测试routine load相关功能&#xff0c;需要配置kafka环境&#xff0c;尤其是需要增加routine load回…

SQL,HQL刷题,尚硅谷

目录 相关表数据&#xff1a; 题目及思路解析&#xff1a; 汇总分析 1、查询编号为“02”的课程的总成绩 2、查询参加考试的学生个数 分组 1、查询各科成绩最高和最低的分&#xff0c;以如下的形式显示&#xff1a;课程号&#xff0c;最高分&#xff0c;最低分 2、查询每门课程…

分享66个行业PPT,总有一款适合您

分享66个行业PPT&#xff0c;总有一款适合您 66个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1kcUOfR_xtH9CAJC12prcTw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知…

ABAP 获取屏幕字段值,field-symbols,assign..TO.. 相关知识实例

ABAP 获取屏幕字段值&#xff0c;field-symbols&#xff0c;assign..TO.. 相关知识实例 以QA32质量放行程序为例子&#xff1a; 由于这个两个值都在结构RQEVA中&#xff0c;为了方便这里获取整个结构值&#xff0c;最后利用指针指向这个程序的这个结构即可获取当前值&#xf…

小红的字符串中值

题目描述: 小红定义一个长度为奇数的字符串的“中值”为中间那个字符。例如"kou"的中值是o。 现在小红拿到了一个字符串&#xff0c;她想知道某个字符是多少个子串的中值。你能帮帮她吗&#xff1f; 输入描述: 输出描述: 一个整数&#xff0c;代表中值为chr的连续子串…

Camunda如何发送邮件及委托代码讲解

&#x1f496;专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据&#xff0c;完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧&#x1f618; &#x1f496;什么是委托…

米贸搜|关于Facebook广告受限:在这些情况下,Meta会限制广告主的广告能力!

如果你被限制了投放广告&#xff0c;那么你会在Facebook上收到通知。 除了审查广告之外&#xff0c;Meta还监控和调查广告主在Meta技术上的行为&#xff0c;在某些情况下&#xff0c;Meta可能会对广告主施加限制&#xff0c;限制广告主的广告能力&#xff0c;这些限制旨在帮助保…

零基础学编程从入门到精通,系统化的编程视频教程上线,中文编程开发语言工具构件之缩放控制面板构件用法

一、前言 零基础学编程从入门到精通&#xff0c;系统化的编程视频教程上线&#xff0c;中文编程开发语言工具构件之缩放控制面板构件用法 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载—…

鸿蒙OS导入项目报错不能运行 @ohos\hvigor\bin\hvigor.js‘

在自学HarmonyOS时&#xff0c;想在DevEco Studio导入官方示例代码&#xff1a;待办列表&#xff08;ArkTS&#xff09;报错 C:\Users\woods\Downloads\test01\ToDoListArkTS\node_modules\ohos\hvigor\bin\hvigor.js --mode module -p moduleentrydefault -p productdefault …

IDEA上传Gitee出错

问题 今天想通过 IDEA 更下新 gitee 上的代码是发生了这个错误。 解决 在 IDEA 终端输入 git config --system --unset credential.helper原因 在一个大佬那里找到了原因 大概意思是-远端仓库的账号和密码错误&#xff0c;你本地有过账号密码登录记录&#xff0c;但不知道…

板块一 Servlet编程:第一节 HTTP协议理论与服务器请求响应原理 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第一节 HTTP协议理论与服务器请求响应原理 一、HTTP特点二、HTTP中的 URL三、两种 HTTP 请求方法&#xff1a;GET 和 POST四、请求响应的底层请求头在服务器中表现响应头在服务器中表现 在上一个板块中我们完成了所有IDEA的基础配置工作&#xf…

【MATLAB】使用梯度提升树在回归预测任务中进行特征选择(深度学习的数据集处理)

1.梯度提升树在神经网络的应用 使用梯度提升树进行特征选择的好处在于可以得到特征的重要性分数&#xff0c;从而识别出对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理速度。此外&…

07-使用Package、Crates、Modules管理项目

上一篇&#xff1a;06-枚举和模式匹配 当你编写大型程序时&#xff0c;组织代码将变得越来越重要。通过对相关功能进行分组并将具有不同功能的代码分开&#xff0c;您可以明确在哪里可以找到实现特定功能的代码&#xff0c;以及在哪里可以改变功能的工作方式。 到目前为止&…

人工智能|深度学习——基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统

代码下载&#xff1a; 基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统.zip资源-CSDN文库 1.研究的背景 水下场景目标检测是水下机器人、水下无人机和水下监控等领域中的重要任务之一。然而&#xff0c;由于水下环境的复杂性和特殊性&#xff0c;水下目标检测面临着许多挑…

有责无权的PM如何管好项目?

一、项目经理的责任和权力分析 项目经理作为项目的责任主体&#xff0c;承担着确保项目顺利完成的重要责任。他们需要确保项目达到预期目标&#xff0c;控制项目进度、成本和质量&#xff0c;并保证项目团队的有效运作。然而&#xff0c;与责任相对应的权力却并不总是与之匹配…

代码随想录算法训练营第四十五天(动态规划篇)|01背包

01背包理论基础 学习资料&#xff1a;代码随想录 (programmercarl.com) 相关链接&#xff1a;题目页面 (kamacoder.com) 背包题目分类 01背包定义 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次…

#免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程

Mac电脑苹果芯片读写NTFS硬盘bash脚本 &#xff08;ntfs.sh脚本内容在本文最后面&#xff09; ntfs.sh脚本可以将Mac系统(苹果M系芯片)上的NTFS硬盘改成可读写的挂载方式&#xff0c;从而可以直接往NTFS硬盘写入数据。此脚本免费&#xff0c;使用过程中无需下载任何收费软件。…

SpringBoo+Vue构建简洁日志文件查看系统

点击下载《SpringBooVue构建日志文件查看系统&#xff08;源代码&#xff09;》 1. 前言 想必经常做java开发的小伙伴&#xff0c;其大多数服务都是运行在linux系统上的&#xff0c;当遇到一些比较棘手的bug需要处理时&#xff0c;经常要上服务器去捞日志&#xff0c;然后通过…