よく知られている Tuckey の URLrewritefilter と同様に、サーブレット フィルターを使用して URL 書き換えを実装したいと考えています。私は喜んで Tuckey のコードを使用したいと思いますが、満たすことができない要件がいくつかあります。
とにかく、このようにフィルターチェーンの上にサーブレットフィルターを作成しました
<filter>
<filter-name>URLRewriteFilter</filter-name>
<filter-class>com.my.app.URLRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>URLRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
more filters with similar mappings
フィルターで、encodeURL メソッドを上書きするために応答をラップします。これはうまく機能します。
私の問題はインバウンド URL にあります。リクエスト URL をインバウンド書き換えルールと一致させようとします。一致する場合は、リダイレクト (動作あり) または転送を送信します。転送の場合、以下のフィルターはすべて処理されません。これは、デフォルトのディスパッチャー マッピングDispatcherType.REQUEST
のみがあるためです。そして、これは正しいです。すべての JSP などへのすべての転送で実行する必要はありません。着信要求を 1 回処理するだけです。次の 20 個のフィルターすべてに追加できることはわかって<dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher>
いますが、それは適切ではありません。
リクエストをラップし、代わりにgetDispatcherType()
メソッドを returnに上書きすることで、コンテナをだまそうとしました。しかし、それはうまくいきません。DispatcherType.REQUEST
FORWARD
Tuckey の実装も forward を使用しているため、同じ問題があるに違いありません。
これを回避する良い方法はありますか?何か案は?