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つのフィルタをマージして新しいフィルタを作成します。次に、フィルタintFilterfをマージします。Integerクラスを受け入れますが、アプリケーション・クラス・ローダーからロードされたすべてのクラスを拒否します:

ObjectInputFilter mergedFilter = ObjectInputFilter.merge(intFilter, f);

マージされたフィルタは、クラスをフィルタする際に次のステップに従います:

  1. いずれかのフィルタがStatus.REJECTEDを返す場合は、Status.REJECTEDを返します。
  2. いずれかのフィルタがStatus.ACCEPTEDを返す場合は、Status.ACCEPTEDを返します。
  3. Status.UNDECIDEDを返します(両方のフィルタはStatus.UNDECIDEDを返します)。

mergeメソッドは、フィルタ・ファクトリで役立ちます。ストリームでフィルタが設定されるたびに、そのフィルタを、mergeメソッドを使用してフィルタ・ファクトリが作成するフィルタに追加できます。例については、ObjectInputFilter APIのドキュメントを参照してください。

ノート:

JVM全体のフィルタを、フィルタ・ファクトリでリクエストされたストリーム固有のフィルタにマージすることをお薦めします。リクエストされたフィルタを返すだけの場合は、JVM全体のフィルタを事実上無効にします。これにより、セキュリティ・ギャップが発生します。