Spring 如果发生错误,则接收HttpRequest的原始路径
我正在编写一个简单的拦截器,它将从我正在接收和发送的所有请求和响应中收集数据,并将其流式传输到外部队列,在那里我可以对其进行过滤,并查看我有: 100次呼叫/测试,95次以状态200结束,4次以状态400结束,1次以状态500结束 我写了一个类似这样的类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
@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);
// ...