Spring 如果发生错误,则接收HttpRequest的原始路径

Spring 如果发生错误,则接收HttpRequest的原始路径,spring,servlets,httprequest,httpresponse,interceptor,Spring,Servlets,Httprequest,Httpresponse,Interceptor,我正在编写一个简单的拦截器,它将从我正在接收和发送的所有请求和响应中收集数据,并将其流式传输到外部队列,在那里我可以对其进行过滤,并查看我有: 100次呼叫/测试,95次以状态200结束,4次以状态400结束,1次以状态500结束 我写了一个类似这样的类 @Component public class HttpEventInterceptor extends HandlerInterceptorAdapter { private final HttpEventStream eventSt

我正在编写一个简单的拦截器,它将从我正在接收和发送的所有请求和响应中收集数据,并将其流式传输到外部队列,在那里我可以对其进行过滤,并查看我有: 100次呼叫/测试,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坏请求。但是,此时createHttpEvent中调用的request.getRequestURI没有返回/test,而是返回/error。在这一点上,我如何到达最初调用的端点

我也试图@Override preHandle,但它是一样的,而且我需要合并来自请求和响应的数据,所以我更喜欢在postHandle中这样做

在这一点上,我如何到达最初调用的端点

根据ServletAPI规范10.9.1,默认错误处理程序将其保存为请求属性,名称由标识

因此,必须按如下方式提供:

String originalRequestURI = (String) request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI);
// ...