3

のサブクラスを使用HttpServletRequestWrapperしてリクエスト パラメータの変換を行っています。変換された値は、最初にリクエストされたときにキャッシュされます。たとえば、最初getQueryString()に呼び出されたときに、呼び出しsuper.getQueryString()て、必要な結果を計算し、それをフィールドに保持してから返します。次回は、キャッシュされた結果を使用します。

この方法は、「転送」がない限り、魅力的に機能します。リクエストが転送されると、Tomcat は元のリクエストを置き換えるため、キャッシュされたクエリ文字列は変更されず、転送されたページは転送先ではなく元のクエリ文字列を取得します。

メソッドをオーバーライドしsetRequest()てキャッシュをクリアすることも役に立ちません。リクエストが 2 回ラップされているかのようsetRequestに、内側のラッパー (私のものではない) で が呼び出され、それがいつ発生するかを知る方法がありません。

「転送」があるときにキャッシュをクリアできるように、ラップされたリクエスト階層に変更があったときに通知を受ける方法を探しています。

4

1 に答える 1

13

元のリクエスト URI は、キーを持つリクエスト属性として利用できますRequestDispatcher.FORWARD_REQUEST_URI

String originalRequestURI = request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);

if (originalRequestURI != null) {
    // It was forwarded. Now get the query string as follows.
    String originalQueryString = request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING);
}

注: 古いサーブレット API バージョンでは、代わりにキーをハードコーディングする必要があります。

String originalRequestURI = request.getAttribute("javax.servlet.forward.request_uri");
// ...
于 2011-04-11T15:52:36.030 に答える