Получите оригинальный путь HttpRequest, если происходит ошибка - PullRequest
0 голосов
/ 06 апреля 2020

Я пишу простой перехватчик, который будет собирать данные обо всех запросах и ответах, которые я получаю и отправляю, и направляет их во внешнюю очередь, где я могу отфильтровать это и посмотреть, что у меня было: 100 вызовов в / test, 95 завершено со статусом 200, 4 закончили со статусом 400, 1 закончили со статусом 500

Я написал класс, который выглядит так

@Component
public class HttpEventInterceptor extends HandlerInterceptorAdapter {
    private final HttpEventStream eventStream;
    private final ObjectMapper objectMapper;

    public HttpEventInterceptor(HttpEventStream eventStream) {
        this.eventStream = eventStream;
        this.objectMapper = new ObjectMapper();
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        final var eventJson = objectMapper.writeValueAsString(createHttpEvent(request, response));
        eventStream.outboundEvents().send(MessageBuilder
                .withPayload(eventJson)
                .setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON)
                .build());
    }

    private HttpEvent createHttpEvent(HttpServletRequest request, HttpServletResponse response) {
        final var event = new HttpEvent();
        event.setTimestamp(System.currentTimeMillis());
        event.setMethod(request.getMethod());
        event.setUrl(request.getRequestURI()); // <-- This isn't working as expected
        event.setResponseCode(response.getStatus());
        return event;
    }
}

Кажется, все работает нормально, кроме одной вещи. Допустим, я вызываю конечную точку / тест с неверным запросом и получаю HttpStatus 400 Bad Request, как и ожидалось. Но в этот момент request.getRequestURI(), вызванный createHttpEvent(), не возвращает / test, а / error. Как мне достичь исходной конечной точки?

Я тоже пытался @Override preHandle(), но это то же самое, также мне нужно объединить данные из запроса и ответа, поэтому я бы предпочел сделать это в postHandle().

1 Ответ

1 голос
/ 06 апреля 2020

Как мне достичь исходной вызываемой конечной точки в этой точке?

Согласно API Servlet spe c 10.9.1, обработчик ошибок по умолчанию сохраняет его в качестве атрибута запроса с именем, обозначенным RequestDispatcher#ERROR_REQUEST_URI.

Таким образом, он должен быть доступен следующим образом:

String originalRequestURI = (String) request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI);
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...