Как узнать, когда запрос перенаправляется в объект RequestWrapper - PullRequest
3 голосов
/ 11 апреля 2011

Я использую подкласс HttpServletRequestWrapper для выполнения некоторых переводов параметров запроса, и я кеширую переведенные значения при первом запросе.Например, при первом вызове getQueryString() я вызываю super.getQueryString() и вычисляю желаемый результат, сохраняю его в поле и затем возвращаю его.В следующий раз я просто использую кэшированный результат.

Этот метод работает как талисман, если только нет некоторого "переадресации".Когда запрос переадресован, Tomcat заменяет исходный запрос, поэтому моя кэшированная строка запроса не изменяется, и перенаправленная страница получает исходную строку запроса, а не ту, на которую пересылается.метод очистки кэша тоже не помогает, так как если запрос обернут дважды, он вызывает setRequest на внутренней оболочке (которая не моя), и я не знаю, когда это произойдет.

Я ищу способ получать уведомления при изменении иерархии завернутых запросов, чтобы можно было очистить кеш при появлении «вперед».

1 Ответ

12 голосов
/ 11 апреля 2011

Исходный 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);
}

Примечание: в более старых версиях Servlet API вам нужно жесткий код вместо ключа.

String originalRequestURI = request.getAttribute("javax.servlet.forward.request_uri");
// ...
...