我正在编写简单的拦截器,该拦截器将从我正在接收和发送的所有请求和响应中收集数据,并将其流式传输到外部队列,在这里我可以对其进行过滤并看到我拥有:在/ 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()
中进行此操作。
我现在如何到达原始被叫端点?
根据Servlet API规范10.9.1,默认错误处理程序将其保存为请求属性,其名称由RequestDispatcher#ERROR_REQUEST_URI
标识。
因此,它必须如下可用:
RequestDispatcher#ERROR_REQUEST_URI