![](/img/trans.png)
[英]HttpServletResponse .sendError returns empty response body when missing CSRF token
[英]Why sendError returns empty response body
我正在嘗試使用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,它應該可以解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.