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

博主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 实现以下安全性和业务需求:

  1. 仅允许反序列化 User 类。

  2. 对反序列化的用户对象进行业务规则验证。

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 方法中定义的业务规则验证,我们可以对加载的用户进行进一步的业务规则检查。

请注意,实际项目中,过滤规则和业务规则验证需要根据具体的安全性和业务需求进行定义。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“SET key value [EX seconds] [PX milliseconds] [NX|XX]“和redis分布式锁

一、可选参数介绍 EX second &#xff1a;设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。PX millisecond &#xff1a;设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key milliseco…

【QT】VS-code报错:LNK2019: 无法解析的外部符号

目录 0.环境 1.问题简述 2.分析报错原因 3.解决方法 1&#xff09;set() 相关语句 2&#xff09;target_link_libraries() 相关语句 4.参考 0.环境 windows11 、 vs-code 、 qt 、 c、编译器为vs2019-x86_amd64 1.问题简述 项目编译release版本时会报错&#xff1a;报错…

代码随想录算法训练营第十四天 | 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

代码随想录算法训练营第十四天 | 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和 文章目录 代码随想录算法训练营第十四天 | 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和1 LeetCode 110.平衡二叉树2 LeetCode 257.二叉树的所有路径3 LeetCode 404.左叶子之和…

浅析一款非驱动考试网关程序(一)

前言 监考程序需要对网络流量进行过滤&#xff0c;不允许除了考试网站以外的其他网站的访问。其实就是实现了一个小型的网关程序&#xff0c;一般地有驱动实现和非驱动实现两种方式。本文只针对一款简易的非驱动实现的监考程序进行分析。 注意&#xff1a;本文通过对某考试监…

第十篇【传奇开心果系列】Python的OpenCV技术点案例示例:图像分割

传奇开心果短博文系列 系列短博文目录Python的OpenCV技术点案例示例系列短博文目录一、前言二、OpenCV图像分割介绍三、OpenCV分割算法示例代码四、归纳总结系列短博文目录 Python的OpenCV技术点案例示例系列 短博文目录 一、前言 OpenCV是一个广泛应用于计算机视觉和图像处…

2023年09月CCF-GESP编程能力等级认证Python编程五级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( ) A:输入 B:输出 C:控制 D:记录 答案:A 第2题 以下关于…

计算机服务器中了mkp勒索病毒如何解密,mkp勒索病毒解密流程

随着网络技术的不断发展与应用&#xff0c;越来越多的企业走向数字化办公模式&#xff0c;计算机极大地方便了企业的正常生产运营&#xff0c;但网络威胁的手段也不断增加。近期&#xff0c;云天数据恢复接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mkp勒索病毒攻击…

Qt 常见容器类用法(一)

目录 QMap类 QHash类 QVector类 QMap类 QMap<key,T>提供一个从类型为Key的键到类型为T的值的映射。通常&#xff0c;QMap存储的数据形式是一个键对应一个值&#xff0c;并且按照键Key的次序存储数据。为了能够支持一键多值的情况&#xff0c;QMap提供QMap<key,T&g…

相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

MPLS——多协议标签交换

目录 1 多协议标签交换 MPLS 1.1 MPLS 的工作原理 1.1.1 MPLS 工作特点 1.1.2 MPLS 协议的基本原理 1.1.3 MPLS 的基本工作过程 1.2 转发等价类 FEC 1.2.1 FEC 用于负载平衡 1.3 MPLS 首部的位置与格式 1.3.1 MPLS 首部的位置 1.3.2 MPLS 首部的格式 1.4 新一代的…

Jmeter 示例,格式为001-100,按顺序生成三位数的函数

1.先添加一个循环控制器&#xff0c;每次执行生成一个数, 2.添加一个beanshell Sample,编写代码,把按00X这个格式的数字&#xff0c;赋值给一个变量LoopCount // 从JMeter变量中获取当前的计数器值 String loopCountStr vars.get("LoopCount"); int loopCount (lo…

1896_Linux中free命令小结

1896_Linux中free命令小结 全部学习汇总&#xff1a; little_bits_of_linux: 一星半点的Linux经验 (gitee.com) 查看Linux中存储的使用情况&#xff0c;我经常使用htop&#xff0c;毕竟这个命令提供的信息是十分直观的。我现在常用的一个小主机其实是我的树莓派3B&#xff0c;虽…

ETL是什么,有哪些ETL工具?就业前景如何?

ETL是什么 ETL&#xff08;Extract-Transform-Load&#xff09;&#xff0c;用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目标端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象并不限于数据仓库。它可以自动化数据处理过程&#xff0c;减少…

C#向数组指定索引位置插入新的元素值:自定义插入方法 vs List<T>.Add(T) 方法

目录 一、使用的方法 1.自定义插入方法 2.使用List.Add(T) 方法 二、实例 1.示例1&#xff1a;List.Add(T) 方法 2.示例&#xff1a;自定义插入方法 一、使用的方法 1.自定义插入方法 首先需要定义一个一维数组&#xff0c;然后修改数组的长度(这里使用Length属性获取…

正点原子--STM32基本定时器学习笔记(1)

这部分是笔者对基本定时器的理论知识进行学习与总结&#xff01;主要记录学习过程中遇到的重难点&#xff0c;其他一些基础点就一笔带过了&#xff01; 1. 定时器概述 1.1 软件定时原理 使用纯软件&#xff08;CPU死等&#xff09;的方式实现定时&#xff08;延时&#xff0…

C++ 动态规划 状态压缩DP 蒙德里安的梦想

求把 NM 的棋盘分割成若干个 12 的长方形&#xff0c;有多少种方案。 例如当 N2&#xff0c;M4 时&#xff0c;共有 5 种方案。当 N2&#xff0c;M3 时&#xff0c;共有 3 种方案。 如下图所示&#xff1a; 2411_1.jpg 输入格式 输入包含多组测试用例。 每组测试用例占一行…

A64指令集架构之PCS过程调用标准

Arm架构对通用寄存器的使用几乎没有限制。简而言之&#xff0c;整数寄存器和浮点寄存器都是通用寄存器。然而&#xff0c;如果你希望你的代码与他人编写的代码互动&#xff0c;或者与编译器生成的代码互动&#xff0c;那么你需要就寄存器的使用达成一致的规则。对于Arm架构&…

Chronos靶机渗透

Chronos靶机 一.信息收集1.靶机IP地址确认2.目录扫描3.常见漏洞扫描5.web网站探测1.网页2.源代码 二.网站渗透1.命令执行2.抓包---burp suite3.反弹shell 三.提权1.node.js原核污染第一个flag 2.sudo提权第二个flag 一.信息收集 1.靶机IP地址确认 ┌──(root㉿kali)-[/] └─…

【Linux系统化学习】文件描述符fd

目录 基础IO预备知识 C语言文件接口 "w"的方式打开&#xff0c;fputs写入 以"a"的方式打开&#xff0c;fputs写入 使用位图传参 系统调用操作文件 open的使用 第一种形式 第二种形式 write() 文件描述符 文件描述符和进程的关系 默认的三个IO流…

JAVASE进阶:高级写法——方法引用(Mybatis-Plus必学前置知识)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;JAVASE进阶&#xff1a;一文精通Stream流函数式编程 &#x1f4da;订阅专栏&#xff1a;JAVASE进阶 希望文章对你们有所帮助 相信…