gpt4 book ai didi

java - 即使启用了缓存,响应主体仍为空

转载 作者:太空宇宙 更新时间:2023-11-04 09:19:10 24 4
gpt4 key购买 nike

无法在我的过滤器中获取响应正文。启用缓存。

我尝试了许多过滤器实现-过滤器,OncePerRequestFilter和GenericFilterBean。我也曾尝试编写自定义缓存机制,但是没有这项工作。我已经有一个日志记录过滤器正在工作-该过滤器在新过滤器之前执行,用于读取请求和响应。日志记录过滤器有效,但我想添加另一个读取响应并针对XSD进行验证的响应。问题是,日志记录过滤器将响应填充为OK,但XML验证器过滤器将获取空字符串。

我的@Controller方法只返回Callable。异步处理可能不是问题,因为记录器过滤器工作良好。

@Component
public class ResposeBodyXmlValidator extends OncePerRequestFilter {
private final XmlUtils xmlUtils;
private final Resource xsdResource;

public ResposeBodyXmlValidator(
XmlUtils xmlUtils,
@Value("classpath:xsd/some.xsd") Resource xsdResource
) {
this.xmlUtils = xmlUtils;
this.xsdResource = xsdResource;
}

@Override
protected void doFilterInternal(
HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain
) throws ServletException, IOException {
ContentCachingResponseWrapper response = new ContentCachingResponseWrapper(httpServletResponse);

doFilter(httpServletRequest, response, filterChain);

if (MediaType.APPLICATION_XML.getType().equals(response.getContentType())) {
try {
xmlUtils.validate(new String(response.getContentAsByteArray(), response.getCharacterEncoding()), xsdResource.getInputStream());
} catch (IOException | SAXException e) {
String exceptionString = String.format("Chyba při volání %s\nNevalidní výstupní XML: %s",
httpServletRequest.getRemoteAddr(),
e.getMessage());
response.setContentType(MediaType.TEXT_PLAIN_VALUE + "; charset=UTF-8");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
response.getWriter().print(exceptionString);
}
}
response.copyBodyToResponse(); // I found this needs to be added at the end of the filter
}
}


我希望我所有的过滤器都能够读取缓存的响应正文。

更新资料

我自己弄错了甚至LoggerFilter也无法读取seponse。我认为这与请求的异步处理有关。

最佳答案

您可以尝试暂时禁用“日志记录”过滤器并仅运行验证器过滤器吗?我想知道是否与读取响应两次有关。

关于java - 即使启用了缓存,响应主体仍为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com