Tomcat でよく使われるフィルターの詳細な説明

Tomcat でよく使われるフィルターの詳細な説明

1. クロスドメインフィルタ CorsFilter

org.apcache.catalina.filters.CorsFilter は、クロスドメイン リソース共有仕様の実装であり、フロントエンドとバックエンドの分離、静的リソースとバックエンドの分離などによく使用されます。主に、HttpServletResponse に Access-Control-* ヘッダーを追加し、HTTP 応答が分割されるのを防ぎ、リクエストが無効であるかアクセスが禁止されている場合に 403 応答コードを返します。

1.1 設定例

<フィルター>
  <filter-name>CorsFilter</filter-name>
  <フィルタークラス>org.apache.catalina.filters.CorsFilter</フィルタークラス>
  <初期化パラメータ>
    <param-name>cors.allowed.origins</param-name>
    <パラメータ値>*</パラメータ値>
  </init-param>
  <初期化パラメータ>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET、POST、HEAD、OPTIONS、PUT</param-value>
  </init-param>
  <初期化パラメータ>
    <param-name>cors.allowed.headers</param-name>
    <param-value>コンテンツ タイプ、X-Requested-With、accept、Origin、アクセス制御要求メソッド、アクセス制御要求ヘッダー</param-value>
  </init-param>
  <初期化パラメータ>
    <param-name>cors.exposed.headers</param-name>
    <param-value>アクセス制御許可元、アクセス制御許可資格情報</param-value>
  </init-param>
  <初期化パラメータ>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <初期化パラメータ>
    <param-name>cors.preflight.maxage</param-name>
    <パラメータ値>10</パラメータ値>
  </init-param>
</フィルター>
<フィルターマッピング>
  <filter-name>CorsFilter</filter-name>
  <urlパターン>/*</urlパターン>
</フィルターマッピング>

1.2 パラメータの説明

1. cors.allowed.origins

アクセスが許可されているクロスドメイン リソースのリスト。「*」は、どのドメインからのリソースへのアクセスも許可されることを意味します。複数のドメインはカンマで区切られます。デフォルト値は「*」です。

2. cors.allowed.methods

リソースにアクセスするために使用できる HTTP メソッドのリスト。クロスドメイン リクエストの場合は「,」で区切られます。これらのメソッドは、プリフライト要求応答の Access-Control-Allow-Methods ヘッダーの一部として表示され、デフォルトは「GET、POST、HEAD、OPTIONS」です。

3. cors.allowed.headers

リクエストの構築時に使用できるリクエスト ヘッダーは、「,」で区切られます。これらのメソッドは、プリフライト応答ヘッダー Access-Control-Allow-Headers の一部として表示されます。デフォルトは Origin、Accept、X-Requested-With、Content-Type、Access-Control-Request-Method、Access-Control-Request-Headers です。

4. cors.exposed.headers

ブラウザがアクセスできるヘッダー情報のリスト(「,」で区切られます)。これらのメソッドは、デフォルトでは空になっている Preflight 応答ヘッダーの Access-Control-Allow-Headers セクションに表示されます。

5. cors.preflight.maxage

ブラウザが Preflght リクエストの結果をキャッシュすることを許可する時間 (秒単位)。負の数の場合、CorsFilter は Preflight 応答にヘッダーを追加しないことを意味します。これらのメソッドは、デフォルトで 1800 に設定されている Preflight 応答ヘッダー Access-Control-Max-Age の一部として表示されます。

6. cors.support.credentials

リソースがユーザー資格情報をサポートするかどうかを示します。これらのメソッドは、プリフライト応答ヘッダー Access-Control-Allow-Credentials の一部として表示されます。デフォルト値は true です。

7. cors.request.decorate

HttpServletRequest に Cors 仕様属性が追加されているかどうか。デフォルトは true です。 CorsFiterはHttpServletRequestにリクエスト関連情報を追加します。cors.request.decorateがtrueに設定されている場合、次のプロパティが追加されます。

1) cors.isCorsRequest: リクエストが Cors リクエストであるかどうかを確認するために使用されます。

2) cors.request.origin: ソース URL、リクエストの発信元ページの URL。

3) cors.request.type: Cors リクエスト タイプ。次のようになります。

SIMPLE : 非プリフライトリクエストが先行するリクエスト。

ACTUAL : プリフライト リクエストに先行するリクエスト。

PRE_FLIGHT : プリフライトリクエスト

NOT_CORS : 通常の同一ドメインリクエスト

INVALID_CORS : 無効なドメインリクエスト

4) cors.request.headers: プリフライト要求の Access-Control-Request-Header ヘッダーとして送信される要求ヘッダー情報。

2. CSRF 保護フィルター CsrfPreventionFilter

org.apcache.catalina.filters.CsrfPreventionFilter は、Web アプリケーションに基本的な CSRF 保護を提供します。クライアントから返されるすべてのリンクは、HttpServletResponse.encodeRedirectURL(String) および HttpServletResponse.encodeURL(String) によってエンコードされます。フィルターは乱数を生成し、比較のためにセッションに保存します。URL は乱数を使用してエンコードされます。次のリクエストを受信すると、リクエスト内の乱数がセッション内の乱数と比較され、両者が同じ場合にのみリクエストが許可されます。

2.1 設定例

<フィルター>
    <filter-name>CsrfPreventionFilter</filter-name>
    <フィルタークラス>org.apache.catalina.filters.CsrfPreventionFilter</フィルタークラス>
    <初期化パラメータ>
        <param-name>拒否ステータス</param-name>
        <パラメータ値>403</パラメータ値>
    </init-param>
    <初期化パラメータ>
        <param-name>エントリポイント</param-name>
        <param-value>/html、/html/list</param-value>
    </init-param>
    <初期化パラメータ>
        <param-name>nonceCacheSize</param-name>
        <パラメータ値>5</パラメータ値>
    </init-param>
</フィルター>
<フィルターマッピング>
    <filter-name>CsrfPreventionFilter</filter-name>
    <urlパターン>/*</urlパターン>
</フィルターマッピング>

2.2 パラメータの説明

1. denyStatus: HTTPレスポンス。リクエストを拒否するために使用される。デフォルトは403。

2. entryPoints: "," で区切られた URL のリスト。これらのリストは乱数チェックされません (主に保護されたアプリケーションから移動して戻るために使用されます)

if ("GET".equals(req.getMethod()) && this.entryPoints.contains(this.getRequestedPath(req))) {
                スキップNonceチェック = true;
 }

3. nonceCacheSize: 乱数キャッシュサイズ。以前に発行された乱数は、同時リクエストをサポートするためにLRUキャッシュにキャッシュされ、ブラウザの更新(最新の乱数ではない結果になる可能性がある)には制限付きで使用されます。デフォルト値は5です。

プライベートint nonceCacheSize = 5;
....
nonceCache == nullの場合{
    nonceCache = 新しい CsrfPreventionFilter.LruCache(this.nonceCacheSize);
      セッションがnullの場合
           セッション = req.getSession(true);
       }

    セッション.setAttribute("org.apache.catalina.filters.CSRF_NONCE", nonceCache);
}

4. randomClass: 乱数を生成するために使用するクラス。java.util.Random のインスタンスである必要があります。設定されていない場合、デフォルトは java.security.SecureRandom です。

3. パラメータ損失防止フィルタFailedRequestFilter

org.apcache.catalina.filters.FailedRequestFilter は、リクエストのパラメータ解析をトリガーするために使用されます。パラメータ解析が失敗すると、リクエストは拒否されます。このフィルタは、クライアントによって送信されたパラメータ情報が失われないようにするために使用されます。このフィルターの原理は、まず ServletRequest.getParameter を呼び出します (最初の呼び出しにより、Tomcat サーバーのリクエスト パラメータ解析がトリガーされます。パラメータ解析が失敗した場合、結果はリクエスト属性 org.apache.catalina.parameter_parse_failed に配置されます)。次に、属性 org.apache.catalina.parameter_parse_failed の値を判別し、空でない場合は直接 400 を返します。

パラメータを正しく解析するには、このフィルタの前に文字セット エンコーディング フィルタ SetCharacterEncodingFilter を設定する必要があります。さらに、このフィルタはr初期化パラメータをサポートしていません。

// 有効なリクエストかどうかを判断します: org.apache.catalina.parameter_parse_failed が null です
プライベートブール値isGoodRequest(ServletRequestリクエスト) {
    リクエストのgetParameter("なし");
    request.getAttribute("org.apache.catalina.parameter_parse_failed") == null を返します。
}

4. クライアントIPフィルターRemoteAddrFilterを取得する

org.apcache.catalina.filters.RemoteAddrFiler を使用すると、送信されたクライアント IP アドレス (ServletRequest.getRemoteAddr 経由で取得) を指定された正規表現と比較できます。

4.1 設定例

<フィルター>
    <filter-name>リモート アドレス フィルター</filter-name>
    <フィルタークラス>org.apache.catalina.filters.RemoteAddrFilter</フィルタークラス>
    <初期化パラメータ>
    <param-name>許可</param-name>
    <パラメータ値>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1</パラメータ値>
    </init-param>
</フィルター>
<フィルターマッピング>
    <filter-name>リモート アドレス フィルター</filter-name>
    <urlパターン>/*</urlパターン>
</フィルターマッピング>

4.2 パラメータの説明

1. allow: アクセスを許可するクライアントIPアドレスを指定します

2. deny: アクセスを拒否するクライアントアドレス

3. denyStatus: リクエストが拒否されたときに返される HTTP 応答。

5. クライアントのホストフィルターRemoteHostFilterを取得する

org.apcache.catalina.filters.RemoteHostFiler を使用すると、要求を送信するクライアントのホスト名を指定された正規表現と比較して、要求を続行するかどうかを判断できます。 RemoteAddrFilterと同じパラメータ

6. 元のクライアントIPフィルターを取得するRemoteIpFilter

クライアントが HTTP プロキシまたは負荷分散を介してサーバーにアクセスする場合、サーバーにとっては、リクエストはフロントエンド プロキシ サーバーから直接送信されます。このとき取得されるリモート IP は、実際にはプロキシ サーバーの IP アドレスです。

6.1. 元のクライアントIPアドレスを取得する方法

HTTP プロトコルは、X-Forwarded-For ヘッダー情報を通じて、クライアントからアプリケーション サーバーへのフロント プロキシの IP アドレスを記録します。RemoteIpFilter は、リクエスト ヘッダーを解析し、リクエスト内の IP アドレスとホスト名をクライアントの実際の IP アドレスとホスト情報に置き換えます。さらに、現在のプロトコル名 http/https、サーバー ポート、および request.secure は、X-Forwarded-Proto リクエスト ヘッダーを通じて置き換えることができます。

X-Forwarded-For の形式は次のとおりです。

X-Forwarded-For: クライアント、プロキシ1、プロキシ2

一番左のクライアントは、元のクライアント IP です。上記の例では、クライアントは proxy1、proxy2、proxy3 の 3 つのレベルのプロキシを通過します (最後のレベルの proxy3 は表示されず、ServletRquest.getRemoteAddr を通じて取得されます)。負荷分散の場合、RemoteAddrFilter と RemoteHostFilter をこのフィルターと組み合わせて使用​​する必要があります。そうしないと、クライアントへのアクセスを適切に制限できません。

通常、次の Java コードを使用して X-Forwarded-For を取得します。

パブリック静的文字列 getIp(HttpServletRequest リクエスト) {
    文字列 requestAddr = request.getHeader("x-forwarded-for");
    requestAddr == null || requestAddr.length() == 0 || "unknown".equalsIgnoreCase(requestAddr) の場合 {
        requestAddr = request.getHeader("プロキシクライアントIP");
    }

    requestAddr == null || requestAddr.length() == 0 || "unknown".equalsIgnoreCase(requestAddr) の場合 {
        requestAddr = request.getHeader("WL-Proxy-Client-IP");
    }

    requestAddr == null || requestAddr.length() == 0 || "unknown".equalsIgnoreCase(requestAddr) の場合 {
        リクエストAddr = request.getRemoteAddr();
    }

    requestAddr を返します。
}

6.2 設定例

1) X-Forwarded-Forヘッダー設定の基本処理

<フィルター>
    <filter-name>リモートIPフィルター</filter-name>
    <フィルタークラス>org.apache.catalina.filters.RemoteIpFilter</フィルタークラス>
</フィルター>

<フィルターマッピング>
    <filter-name>リモートIPフィルター</filter-name>
    <urlパターン>/*</urlパターン>
    <dispatcher>リクエスト</dispatcher>
</フィルターマッピング>

2) X-Forwarded-Forおよびx-forwarded-protoヘッダー設定の処理

<フィルター>
    <filter-name>リモートIPフィルター</filter-name>
    <フィルタークラス>org.apache.catalina.filters.RemoteIpFilter</フィルタークラス>
    <初期化パラメータ>
    <param-name>プロトコルヘッダー</param-name>
    <param-value>x-forwarded-proto</param-value>
    </init-param>
</フィルター>

<フィルターマッピング>
    <filter-name>リモートIPフィルター</filter-name>
    <urlパターン>/*</urlパターン>
    <dispatcher>リクエスト</dispatcher>
</フィルターマッピング>

3) 内部プロキシを使用した高度な設定

<フィルター>
    <filter-name>リモートIPフィルター</filter-name>
    <フィルタークラス>org.apache.catalina.filters.RemoteIpFilter</フィルタークラス>
    <初期化パラメータ>
        <param-name>許可された内部プロキシ</param-name>
        <パラメータ値>192\.168\.0\.10|192\.168\.0\.11</パラメータ値>
    </init-param>
    <初期化パラメータ>
        <param-name>リモートIpヘッダー</param-name>
        <param-value>x-forwarded-for</param-value>
    </init-param>
    <初期化パラメータ>
        <param-name>リモートIpProxiesヘッダー</param-name>
        <param-value>x-forwarded-by</param-value>
    </init-param>
    <初期化パラメータ>
        <param-name>プロトコルヘッダー</param-name>
        <param-value>x-forwarded-proto</param-value>
    </init-param>
</フィルター>

4) 信頼できるプロキシの詳細設定を使用する

<フィルター>
    <filter-name>リモートIPフィルター</filter-name>
    <フィルタークラス>org.apache.catalina.filters.RemoteIpFilter</フィルタークラス>
    <初期化パラメータ>
        <param-name>許可された内部プロキシ</param-name>
        <パラメータ値>192\.168\.0\.10|192\.168\.0\.11</パラメータ値>
    </init-param>
    <初期化パラメータ>
        <param-name>リモートIpヘッダー</param-name>
        <param-value>x-forwarded-for</param-value>
    </init-param>
    <初期化パラメータ>
        <param-name>リモートIpProxiesヘッダー</param-name>
        <param-value>x-forwarded-by</param-value>
    </init-param>
    <初期化パラメータ>
        <param-name>信頼できるプロキシ</param-name>
        <param-value>プロキシ1|プロキシ2</param-value>
    </init-param>
</フィルター>

7. 文字セットエンコーディングフィルター SetCharacterEncodingFilter

文字セットのエンコーディングを設定する方法を提供します。通常、デフォルトのエンコーディングは ISO-8859-1 ですが、実際の運用環境では UTF-8 が推奨されます。エンコーディングが指定されていない場合はリクエスト内のエンコーディングを使用することも、強制的に上書きすることもできます。

7.1 設定例

<フィルター>
    <filter-name>文字エンコーディングフィルターの設定</filter-name>
    <フィルタークラス>org.apache.catalina.filters.SetCharacterEncodingFilter</フィルタークラス>
    <初期化パラメータ>
        <param-name>エンコーディング</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <初期化パラメータ>
        <param-name>無視</param-name>
        <param-value>false</param-value>
    </init-param>
</フィルター>
<フィルターマッピング>
    <filter-name>文字エンコーディングフィルターの設定</filter-name>
    <urlパターン>/*</urlパターン>
</フィルターマッピング>

7.2 パラメータの説明

1. エンコーディング: 指定された文字セットのエンコーディング

2. ignore: クライアント要求によって設定された文字セットエンコーディングを無視するかどうかを示します。true の場合、要求された文字セットエンコーディングは上書きされます。false の場合、要求で文字セットエンコーディングが指定されていない場合に設定されます。デフォルトはfalse

上記はTomcatのよく使われるフィルターの詳しい説明です。Tomcatフィルターの詳細については、123WORDPRESS.COMの他の関連記事もご覧ください。

以下もご興味があるかもしれません:
  • tomcat8 に基づく無効な文字エンコーディング フィルタの問題に対する解決策
  • Tomcat コアコンポーネントとアプリケーションアーキテクチャの詳細な説明
  • Tomcatアーキテクチャの原則をアーキテクチャ設計に分析する
  • Tomcat が設定ファイルを外部に配置するためのソリューション
  • Webリクエストと処理のTomcatソースコード分析

<<:  MySQL の時間タイプの選択

>>:  ウェブページの読みやすさを向上させるいくつかの方法

推薦する

MySQLの文字セットを変更する方法

1. MySQLの文字セットを確認する '%char%' のような変数を表示します。...

HTML の基礎必読 - CSS スタイルシートの包括的な理解

CSS (カスケーディング スタイル シート) は、HTML Web ページを美しくするために使用さ...

CSSの高さの崩壊問題についての簡単な説明

パフォーマンス例えば: HTML: <div class="first"&...

mysql バックアップ戦略の実装 (フルバックアップ + 増分バックアップ)

目次設計シナリオ技術的なポイントサーバー情報準備フルバックアップスクリプト(Mysql-FullyB...

MySQL PXC クラスターの構築方法

目次1. PXCの紹介1.1 PXC の紹介1.2 PXC の特徴と利点1.3 PXCの限界と欠点1...

MySQL テーブル全体の暗号化ソリューション keyring_file の詳細な説明

例示するMySql Community Edition は、5.7.11 以降、テーブルベースのデー...

Firefox で Webdings フォントをサポートする方法

Firefox、Opera、その他のブラウザは Webdings フォントをサポートしていません。回...

超詳細なMySQL使用仕様の共有

最近、データベース関連の操作が多くなり、会社の既存の仕様はあまり包括的ではありません。インターネット...

Ubuntu Dockerのインストールと使い方

目次1. 公式インストールスクリプトを使用した自動インストール手動インストール古いバージョンをアンイ...

MySQL の 4 つのトランザクション分離レベルを例を使って分析する

序文データベース操作では、同時データ読み取りの正確性を効果的に保証するために、トランザクション分離レ...

Vue3とVue2の利点のまとめ

目次1. なぜ vue3 が必要なのでしょうか? 2. vue3の利点3. 応答原則の違い4. ライ...

koa2 サービスに SSL を設定する方法

I. はじめに1: SSL証明書私のドメイン名は Tencent Cloud にあります。第 3 レ...

CSS の clip-path プロパティの使用方法の詳細な説明

クリップパスの使用ポリゴン値は複数の座標点で構成されます。最初の値は x 方向、2 番目の値は y ...

ウェブデザインのためのロイヤルブルーのカラーマッチング入門

古典的な色の組み合わせは力と権威を伝え、強いロイヤルブルーはあらゆる古典的な色の組み合わせの中心的な...

MySQL innodb B+ツリーの高さを取得する方法

序文MySQL の InnoDB エンジンがインデックスの保存に B+tree を使用する理由は、デ...