- 封闭接口:
ObjectInputFilter
ObjectInputFilter 。
JVM 范围的反序列化过滤器工厂和静态 JVM 范围的过滤器可以在 ObjectInputFilter.Config 类的初始化期间从系统属性进行配置。
如果 Java 虚拟机以系统属性 jdk.serialFilter 启动,则其值用于配置过滤器。如果未定义系统属性,但定义了 Security 属性 jdk.serialFilter,则它用于配置过滤器。过滤器的创建就像调用 createFilter 一样,如果过滤器字符串无效,则初始化失败,随后尝试 得到过滤器 、 设置过滤器 或创建 ObjectInputStream throw IllegalStateException 。使用无效的串行过滤器无法进行反序列化。如果系统属性 jdk.serialFilter 或 Security 属性 jdk.serialFilter 未设置,则可以使用 Config.setSerialFilter 设置过滤器。将 jdk.serialFilter 设置为 System.setProperty does not set the filter。属性值的语法与 createFilter 方法相同。
如果 Java 虚拟机以系统属性 jdk.serialFilterFactory 或同名的 Security 属性启动,则其值命名该类以配置 JVM 范围的反序列化过滤器工厂。如果未定义系统属性,但定义了 Security 属性 jdk.serialFilterFactory,则它用于配置过滤器工厂。如果保持未设置,过滤器工厂是与以前版本兼容的内置过滤器工厂。
该类必须是公共的,必须具有公共的零参数构造函数,实现 BinaryOperator<ObjectInputFilter> 接口,提供其实现并可通过 应用程序类加载器 访问。如果未成功调用过滤器工厂构造函数,则后续尝试 得到工厂 、 设置工厂 或创建 ObjectInputStream throw IllegalStateException 。无效的串行过滤器工厂无法进行反序列化。在初始化期间使用系统或安全属性配置的过滤器工厂不能用 Config.setSerialFilterFactory 替换。这确保了在命令行上设置的过滤器工厂不会被应用程序意外或有意地覆盖。
将 jdk.serialFilterFactory 设置为 System.setProperty does not set the filter factory。系统属性值和安全属性值的语法是反序列化过滤器工厂的完全限定类名。
- 自从:
- 9
-
方法总结
修饰符和类型方法描述static ObjectInputFiltercreateFilter(String pattern) 从一串模式中返回一个 ObjectInputFilter。static ObjectInputFilter返回静态 JVM 范围的反序列化过滤器或null(如果未配置)。static BinaryOperator<ObjectInputFilter>返回 JVM 范围的反序列化过滤器工厂。static voidsetSerialFilter(ObjectInputFilter filter) 如果尚未配置或设置静态 JVM 范围过滤器,请设置它。static voidsetSerialFilterFactory(BinaryOperator<ObjectInputFilter> filterFactory) 设置 JVM 范围内的反序列化过滤器工厂 。
-
方法详情
-
getSerialFilter
返回静态 JVM 范围的反序列化过滤器或null(如果未配置)。- 返回:
-
静态 JVM 范围的反序列化过滤器或
null(如果未配置) - 抛出:
IllegalStateException- 如果从系统属性jdk.serialFilter或安全属性jdk.serialFilter初始化过滤器失败。
-
setSerialFilter
如果尚未配置或设置静态 JVM 范围过滤器,请设置它。- 参数:
filter- 设置为 JVM 范围过滤器的反序列化过滤器;不为空- 抛出:
SecurityException- 如果有安全管理器且SerializablePermission("serialFilter")未被授予IllegalStateException- 如果过滤器已经设置或从系统属性jdk.serialFilter或安全属性jdk.serialFilter初始化过滤器失败。
-
getSerialFilterFactory
返回 JVM 范围的反序列化过滤器工厂。如果过滤器工厂是 set 则返回,否则返回内置的反序列化过滤器工厂。当从 ObjectInputStream 构造函数 调用时以及使用setObjectInputFilter设置特定于流的过滤器时,过滤器工厂为每个 ObjectInputStream 提供过滤器。- 实现要求:
-
当从 ObjectInputStream 构造函数 调用时,内置反序列化过滤器工厂提供 静态 JVM 范围的过滤器。当调用
to set the stream-specific filter时,请求的过滤器将替换静态 JVM 范围的过滤器,除非它已经被设置。内置反序列化过滤器工厂实现了早期版本在ObjectInputStream构造函数和ObjectInputStream.setObjectInputFilter(java.io.ObjectInputFilter)中设置初始过滤器的行为。 - 返回:
- JVM范围的反序列化过滤器工厂;非空
- 抛出:
IllegalStateException- 如果过滤器工厂初始化不完整- 自从:
- 17
-
setSerialFilterFactory
设置 JVM 范围内的反序列化过滤器工厂 。过滤器工厂可以使用以下方法之一配置一次:在命令行上设置jdk.serialFilterFactory属性,在Security文件中设置jdk.serialFilterFactory属性,或使用此setSerialFilterFactory方法。过滤器工厂只能在创建任何ObjectInputStream之前设置,以避免使用过滤器工厂时出现任何不一致。JVM 范围的过滤器工厂在 ObjectInputStream 被建造 和 特定于流的过滤器已设置 时被调用。参数是当前过滤器和请求的过滤器,它返回要用于流的过滤器。如果当前过滤器是
non-null,过滤器工厂必须返回一个non-null过滤器;这是为了防止在启用过滤后无意中禁用过滤。工厂根据其输入、任何其他过滤器、上下文或可用状态来确定要用于ObjectInputStream流的过滤器。工厂可能会抛出运行时异常以表示使用不当或参数无效。有关组合和委托的示例,请参阅 过滤模型。- 参数:
filterFactory- 反序列化过滤器工厂设置为 JVM 范围的过滤器工厂;不为空- 抛出:
IllegalStateException- 如果内置反序列化过滤器工厂已被替换或已创建ObjectInputStream的任何实例。SecurityException- 如果有安全管理器且SerializablePermission("serialFilter")未被授予- 自从:
- 17
-
createFilter
从一串模式中返回一个 ObjectInputFilter。模式以“;”分隔(分号)。空格很重要,被认为是模式的一部分。如果一个模式包含一个等于分配,“
=”它设置了一个限制。如果限制出现多次,则使用最后一个值。- maxdepth=
value- 图的最大深度 - maxrefs=
value- 内部引用的最大数量 - maxbytes=
value- 输入流中的最大字节数 - maxarray=
value- 允许的最大数组长度
其他模式匹配或拒绝从
Class.getName()返回的类或包名称,如果存在可选模块名称class.getModule().getName()。请注意,对于数组,模式中使用的是元素类型,而不是数组类型。- 如果模式以“!”开头,如果匹配到剩余的模式,则该类被拒绝;否则,如果模式匹配,则允许该类。
- 如果模式中包含“/”,则“/”之前的非空前缀为模块名;如果模块名称与类的模块名称匹配,则剩余模式与类名称匹配。如果没有“/”,则不比较模块名。
- 如果模式以“.**”结尾,它匹配包和所有子包中的任何类。
- 如果模式以“.*”结尾,它匹配包中的任何类。
- 如果模式以“*”结尾,它匹配任何以该模式为前缀的类。
- 如果模式等于类名,则匹配。
- 否则,模式不匹配。
生成的过滤器执行限制检查,然后尝试匹配类(如果有)。如果超出任何限制,过滤器将返回
Status.REJECTED。如果类是数组类型,则匹配的类是元素类型。任意维数的数组都被视为与元素类型相同。例如,“!example.Foo”模式拒绝创建example.Foo的任何实例或数组。第一个匹配的模式从左到右确定Status.ALLOWED或Status.REJECTED结果。如果未超出限制并且没有模式与该类匹配,则结果为Status.UNDECIDED。- 参数:
pattern- 要解析的模式字符串;不为空- 返回:
-
一个过滤器来检查正在反序列化的类;
null如果没有模式 - 抛出:
IllegalArgumentException- 如果模式字符串非法或格式错误且无法解析。特别是,如果以下任何一项为真:- 如果限制缺少名称或名称不是“maxdepth”、“maxrefs”、“maxbytes”或“maxarray”之一
- 如果 limit 的值不能被
Long.parseLong解析或者是负数 - 如果模式包含“/”并且缺少模块名称或剩余模式为空
- 如果缺少“.*”和“.**”的包
- maxdepth=
-