31

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 を使用しています。

4

2 に答える 2

-7

さらに、フィルタが適用される順序を定義できます。これは、web.xml に次の行を追加することで実現できます。

<absolute-ordering>
  <name>encodingFilter</name>
  <name>SpringFormMethodFilter</name>
</absolute-ordering>

詳細については、これを確認してください。

于 2013-10-24T13:54:49.830 に答える