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全体のフィルタを事実上無効にします。これにより、セキュリティ・ギャップが発生します。