0

よく知られている 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.REQUESTFORWARD

Tuckey の実装も forward を使用しているため、同じ問題があるに違いありません。

これを回避する良い方法はありますか?何か案は?

4

0 に答える 0