ObjectInputFilterメソッドを使用したフィルタの作成
ObjectInputFilter
インタフェースには、フィルタを迅速に作成できる次の静的メソッドが含まれています:
- allowFilter(Predicate<Class<?>>, ObjectInputFilter.Status)
- rejectFilter(Predicate<Class<?>>, ObjectInputFilter.Status)
- rejectUndecidedClass(ObjectInputFilter)
- merge(ObjectInputFilter, ObjectInputFilter)
allowFilterメソッドは、引数としてClass
を取得するPredicate
に基づいてフィルタを作成します。述語がtrueの場合、作成されたフィルタはObjectInputFilter.Status.ALLOWED
を返します。それ以外の場合は、allowFilter
メソッドの2番目の引数の値を返します。次に、Integer
クラスを受け入れるフィルタを作成します。他のすべてのクラスは未決定とみなされます:
ObjectInputFilter intFilter = ObjectInputFilter.allowFilter(
cl -> cl.equals(Integer.class), ObjectInputFilter.Status.UNDECIDED);
rejectFilterメソッドは、allowFilter
の逆です。Classを引数として取るPredicateに基づいてフィルタを作成します。述語がtrueの場合、作成されたフィルタはObjectInputFilter.Status.REJECTEDを返します。それ以外の場合は、rejectFilterメソッドの2番目の引数の値を返します。次に、アプリケーション・クラス・ローダーからロードされたクラスを拒否するフィルタを作成します:
ObjectInputFilter f = ObjectInputFilter.rejectFilter(cl ->
cl.getClassLoader() == ClassLoader.getSystemClassLoader(), Status.UNDECIDED);
rejectUndecidedClass
メソッドは、既存のフィルタが未決定クラスとみなすクラスを拒否することで、既存のフィルタに基づいて新しいフィルタを作成します。次に、intFilter
に基づいてフィルタを作成します。Integer
クラスを受け入れますが、他のすべての(未決定の)クラスを拒否します:
ObjectInputFilter rejectUndecidedFilter =
ObjectInputFilter.rejectUndecidedClass(intFilter);
merge
メソッドは、2つのフィルタをマージして新しいフィルタを作成します。次に、フィルタintFilter
とf
をマージします。Integer
クラスを受け入れますが、アプリケーション・クラス・ローダーからロードされたすべてのクラスを拒否します:
ObjectInputFilter mergedFilter = ObjectInputFilter.merge(intFilter, f);
マージされたフィルタは、クラスをフィルタする際に次のステップに従います:
- いずれかのフィルタがStatus.REJECTEDを返す場合は、Status.REJECTEDを返します。
- いずれかのフィルタがStatus.ACCEPTEDを返す場合は、Status.ACCEPTEDを返します。
- Status.UNDECIDEDを返します(両方のフィルタはStatus.UNDECIDEDを返します)。
merge
メソッドは、フィルタ・ファクトリで役立ちます。ストリームでフィルタが設定されるたびに、そのフィルタを、merge
メソッドを使用してフィルタ・ファクトリが作成するフィルタに追加できます。例については、ObjectInputFilter APIのドキュメントを参照してください。
ノート:
JVM全体のフィルタを、フィルタ・ファクトリでリクエストされたストリーム固有のフィルタにマージすることをお薦めします。リクエストされたフィルタを返すだけの場合は、JVM全体のフィルタを事実上無効にします。これにより、セキュリティ・ギャップが発生します。