gpt4 book ai didi

java - 为什么 sendError 返回空响应体

转载 作者:行者123 更新时间:2023-11-30 10:05:08 26 4
gpt4 key购买 nike

我正在尝试使用 HttpServletResponse 中的 sendError 方法,但总是返回空主体响应。

@Override
protected void doFilterInternal(@NonNull HttpServletRequest httpServletRequest,
@NonNull HttpServletResponse httpServletResponse,
@NonNull FilterChain filterChain)
throws ServletException, IOException {

String token = jwtTokenProvider.resolveToken(httpServletRequest);
try {
if (token != null && jwtTokenProvider.validateToken(token)) {
Authentication auth = jwtTokenProvider.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
} catch (CustomException ex) {
SecurityContextHolder.clearContext();
httpServletResponse.sendError(ex.getHttpStatus().value(), ex.getMessage());
return;
}
filterChain.doFilter(httpServletRequest, httpServletResponse);
}

由于它不起作用,我尝试构建自己的响应并将其返回给客户端(这是一个 API 调用)。

String error = "Expired or invalid JWT token";
ApiError errorResponse = new ApiError(new Date(),500, HttpStatus.INTERNAL_SERVER_ERROR, error, ex.getLocalizedMessage(), httpServletRequest.getRequestURL().toString());
httpServletResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
httpServletResponse.getWriter().write(convertObjectToJson(errorResponse));
private String convertObjectToJson(Object object) throws JsonProcessingException {
if (object == null) {
return null;
}
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(object);
}

这行得通,但我必须使用字符串构造它,然后将其转换为 JSON。我只想使用 sendError 方法。有人可以帮我弄清楚为什么响应主体总是空的吗?空体响应(使用sendError时)的状态码为403。

最佳答案

当我从 1.5.8 升级到 spring boot 2.1 时,我开始遇到同样的问题。

升级前过滤器HeaderWriterFilter不在过滤器链中,貌似是spring自动添加的。当调用 sendError 时,此过滤器也会调用您的过滤器。

您没有提及您是在实现 Filter 还是扩展特定的过滤器,但如果您可以扩展 OncePerRequestFilter,它应该可以解决问题。

关于java - 为什么 sendError 返回空响应体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55466852/

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