web-dev-qa-db-ja.com

サーブレットフィルターの実行順序

何が起こっているのかを知る前に、しばらくの間、私のウェブアプリケーションのバグに出くわし、頭を引っ掻いた(そして最終的には髪を引っ張った)ことがありました。

基本的に、web.xmlで定義された2つのフィルターと、そのような2つのマッピングがありました。

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>

<filter-mapping>
    <filter-name>SpringFormMethodFilter</filter-name>
    <url-pattern>/administration/*</url-pattern>
</filter-mapping>

どちらもSpring MVCフィルターです。私の問題は、encodingFilterが要求エンコードをUTF-8に設定することになっているにもかかわらず、他の何かがそれを読み取る機会を持つ前に、取得したフォームデータがUTF-8として解釈されないことでした。

フィルターマッピングが定義される順序は、それらが連鎖される順序であると想定されていますが、フォームメソッドフィルターがエンコードフィルターの前に実行されたことにようやく気付きました。

チェーン内のフィルターの順序は、フィルターマッピングがWebアプリケーションデプロイメント記述子に表示される順序と同じです。

Oracle から)

同じマッピング、つまりURLパターンではなくサーブレットへのマッピングを使用すると、両方のマッピングで順序が復元され、すべてが意図したとおりに機能します。

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>

<filter-mapping>
    <filter-name>SpringFormMethodFilter</filter-name>
    <servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>

その部分はServlet仕様の一部ですか、それともTomcatのグリッチですか?どこかに文書化されていますか、バグレポートを提出する必要がありますか?

Java 7.でTomcat 7.0.39を使用しています。

31
Pierre Henry

コンテナがリクエストを受け取ると、リクエストURIと一致する<url-pattern>を持つすべてのフィルターマッピングを最初に見つけます。これは、フィルターチェーンの最初のフィルターセットになります。次に、リクエストURIと一致する<servlet-name>を持つすべてのフィルターマッピングを検索します。これは、フィルターチェーン内の2番目のフィルターセットになります。両方のセットで、D.Dで宣言されている順序でフィルターが実行されます。

specs に従って

特定のリクエストURIに適用されるフィルターのチェーンを構築する際にコンテナが使用する順序は次のとおりです。

  1. まず、<url-pattern>マッチングフィルターマッピングは、これらの要素が展開記述子に表示されるのと同じ順序です。
  2. 次に、<servlet-name>マッチングフィルターは、これらの要素が展開記述子に表示されるのと同じ順序でマッピングします。
44
NINCOMPOOP