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

问题描述 投票:0回答:1

我正在编写简单的拦截器,该拦截器将从我正在接收和发送的所有请求和响应中收集数据,并将其流式传输到外部队列,在这里我可以对其进行过滤并看到我拥有:在/ test处进行了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;
    }
}

除了一件事,一切似乎都可以正常工作。假设,我用错误的请求调用了端点/ test,并且按预期收到了HttpStatus 400错误的请求。但是,此时在request.getRequestURI()中调用的createHttpEvent()不会返回/ test,而是/ error。我现在如何到达原始被叫端点?

我也尝试过@Override preHandle(),但是还是一样,我还需要合并请求和响应中的数据,所以我更愿意在postHandle()中进行此操作。

spring servlets httprequest httpresponse interceptor
1个回答
1
投票

我现在如何到达原始被叫端点?

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

因此,它必须如下可用:

RequestDispatcher#ERROR_REQUEST_URI
© www.soinside.com 2019 - 2024. All rights reserved.