Web アプリケーションのバグに遭遇し、何が起こっているのかがわかるまでしばらくの間、頭をかきむしりました (そして最終的には髪を引っ張っていました)。
基本的に、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 アプリケーションの展開記述子に表示される順序と同じです。
(オラクルより)
同じマッピング、つまり 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 を使用しています。