我正在尝试使用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,它应该可以解决此问题。

10-05 23:52