如果控制器返回 Mono<ResponseEntity,则过滤器中的 ContentCachingResponseWrapper 上没有内容<>>



如下所示,有一个servlet过滤器实现,期望responseWrapper响应,但在控制器第一个实现中不工作,reqBody为空字符串,而控制器第二个实现工作,因为它不返回Mono类型。在发出另一个请求之前,让我知道如何从控制器响应中填充reqBody。注意:在回复原始客户之前,我必须向另一个服务提出请求并整理回复。过滤器实现

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterchain)
throws IOException, ServletException {
try {
if (((HttpServletRequest) request).getRequestURI().contains("/quota")) {
filterchain.doFilter(request, response);
return;
}
ContentCachingResponseWrapper responseWrapper =
new ContentCachingResponseWrapper((HttpServletResponse) response);
filterchain.doFilter(request, responseWrapper);
String reqBody = new String(responseWrapper.getContentAsByteArray());

logger.info("Response string :" + reqBody);
ResponseEntity<String> result = restTemplate.postForEntity(new URI("http://localhost:8084/quota"), reqBody, String.class);
logger.info("Result" + result.getBody());
} catch (Exception e) {
logger.error("Exception", e);
}
}

控制器实施第一次

@RequestMapping("/userdata")
Mono<ResponseEntity<String>>getUserData(){
return Mono.just(new ResponseEntity<>("{"userdata" : "Data"}", HttpStatus.OK));
}

控制器实施第二次

@RequestMapping("/userdata")
Mono<ResponseEntity<String>>getUserData(){
return ResponseEntity.ok("{"userdata" : "Data"}");
}

如果您的应用程序使用的是Spring WebFlux,那么这是预期的:Spring WebFlux:不公开Servlet API,因此Servlet过滤器不能在这里使用反应式编程模型。

SpringWebFlux引入了一个新的org.springframework.web.server.WebFilter,它可以与Servlet过滤器相媲美。我不知道WebFilter有任何现有的ContentCaching实现。

最新更新