パターン・ベースのフィルタの作成

パターン・ベースのフィルタの定義には、アプリケーション・コードの変更は伴いません。プロパティ・ファイルでJVM全体のフィルタを追加するか、またはjavaコマンド行でアプリケーションに固有のフィルタを追加します。

パターン・ベースのフィルタは、一連のパターンです。各パターンは、ストリームまたはリソース制限内のクラス名と照合されます。クラス・ベースおよびリソース制限のパターンは、各パターンがセミコロン(;)で区切られた1つのフィルタ文字列に結合できます。

パターン・ベースのフィルタ構文

パターンで構成されたフィルタを作成する場合は、次のガイドラインを使用します。
  • パターンをセミコロンで区切ります。たとえば:

    pattern1.*;pattern2.*
  • 空白は重要であり、パターンの一部とみなされます。

  • 最初に制限を文字列にします。これらは、文字列内の場所に関係なく最初に評価されるため、最初に配置することによって順序付けを強調します。それ以外の場合、パターンは左から右に評価されます。

  • 先頭が!のパターンに一致するクラス名は拒否されます。!がないパターンに一致するクラス名は許可されます。次のフィルタは、pattern1.MyClassを拒否しますが、pattern2.MyClassを許可します:
    !pattern1.*;pattern2.*
  • 次の例に示すように、ワイルドカード記号(*)を使用してパターン内の未指定クラス名を表します:
    • すべてのクラス名が一致するようにするには、*を使用します

    • mypackage内のすべてのクラス名が一致するようにするには、mypackage.*を使用します

    • mypackage内のすべてのクラス名およびそのサブパッケージが一致するようにするには、mypackage.**を使用します

    • 先頭がtextのすべてのクラス名が一致するようにするには、text*を使用します

クラス名がどのフィルタにも一致しない場合、そのクラス名は許可されています。特定のクラス名のみを許可する場合は、フィルタが一致しないものをすべて拒否する必要があります。指定されたクラス名以外のすべてのクラス名を拒否するには、クラス・フィルタ内の最後のパターンとして!*を含めます。

パターンの構文の詳細は、JEP 290を参照してください。

パターン・ベースのフィルタの制限事項

パターン・ベースのフィルタには、次のような制限があります:

  • パターンでは、クラス名に基づいて配列のサイズを変えることができません。

  • パターンは、クラス名のスーパータイプまたはインタフェースに基づいたクラスと一致させることができません。

  • パターンには状態がなく、ストリーム内の以前にデシリアライズされたクラス・インスタンスに基づいて選択を行うことができません。

ノート:

パターン・ベースのフィルタは、デシリアライズされるクラスによって実装されているインタフェースをチェックしません。このフィルタは、ストリーム内で明示的に参照されるインタフェースに対して呼び出されます。デシリアライズされるオブジェクトのクラスによって実装されるインタフェースに対しては呼び出されません。

1つのアプリケーションのパターン・ベースのフィルタの定義

1つのアプリケーションのシステム・プロパティとしてパターン・ベースのフィルタを定義できます。システム・プロパティは、セキュリティ・プロパティの値よりも優先されます。

1つのアプリケーションおよびJavaの単一の呼出しにのみ適用されるフィルタを作成するには、コマンド行でjdk.serialFilterシステム・プロパティを定義します。

次の例では、個々のアプリケーションのリソース使用率を制限する方法を示します。

java -Djdk.serialFilter=maxarray=100000;maxdepth=20;maxrefs=500 com.example.test.Application

すべてのアプリケーションのパターン・ベースのフィルタの定義

セキュリティ・プロパティとして指定することで、$JAVA_HOMEからJavaランタイムで実行されるすべてのアプリケーションに影響を与えるパターン・ベースのJVM全体のフィルタを定義できます。(システム・プロパティは、セキュリティ・プロパティの値よりも優先されます。)ファイル$JAVA_HOME/conf/security/java.securityを編集し、パターン・ベースのフィルタをjdk.serialFilterセキュリティ・プロパティに追加します。

クラス・フィルタの定義

グローバルに適用されるパターン・ベースのクラス・フィルタを作成できます。たとえば、パターンはワイルドカードを含むクラス名またはパッケージである可能性があります。

次の例では、フィルタはパッケージ(!example.somepackage.SomeClass)の1つのクラス名を拒否し、他のすべてのクラス名を許可します:
jdk.serialFilter=!example.somepackage.SomeClass;example.somepackage.*;
前述のフィルタ例では、example.somepackage.*のクラス名だけでなく、他のすべてのクラス名を許可します。他すべてのクラス名を拒否するには、!*を追加します:
jdk.serialFilter=!example.somepackage.SomeClass;example.somepackage.*;!*

リソース制限フィルタの定義

リソース・フィルタは、グラフの複雑度とサイズを制限します。次のパラメータのフィルタを作成して、各アプリケーションのリソース使用率を制御できます。
  • 許容最大配列サイズ。たとえば: maxarray=100000;

  • グラフの最大の深さ。たとえば: maxdepth=20;

  • オブジェクト間のグラフ内の最大参照。たとえば: maxrefs=500;

  • ストリーム内のバイトの最大値。たとえば: maxbytes=500000;