【问题标题】:Why sendError returns empty response body为什么 sendError 返回空响应正文
【发布时间】:2019-04-02 04:12:47
【问题描述】:

我正在尝试使用来自 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。

【问题讨论】:

    标签: java spring-boot servlets


    【解决方案1】:

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

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

    你没有提到你是在实现过滤器还是扩展一个特定的过滤器,但是如果你可以扩展 OncePerRequestFilter 它应该可以解决这个问题。

    【讨论】:

    • 从 Spring boot 1 系列升级到 2 系列后,我也遇到了自定义安全过滤器的这个问题。我在日志中注意到过滤器似乎触发了两次,并且实施 OncePerRequestFilter 确实解决了这个问题,但我很好奇为什么 HeaderWriterFilter 第二次调用我的过滤器以及为什么会导致响应主体被剥离。你能扩展你的答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2022-01-03
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多