如何从弹簧过滤器返回响应为 Json?

Dia*_*ana 4 rest spring spring-mvc

在 spring 休息中,我需要从过滤器类的 doFilter() 发送身份验证错误。作为回应,我需要发送带有状态、消息和错误代码等字段的 json。请建议如何实现。我们没有使用 spring boot.Below 是关于身份验证错误的示例响应

{“responseCode”:“错误代码”,“responseMessage”:“一些错误消息”,“responseStatus”:“失败”}

在 doFiler() 中,我正在验证令牌,如果它无效,我需要发送上面的示例响应。

cas*_*lin 18

假设您将 JacksonObjectMapper公开为 Spring bean,您可以将以下内容用于 a OncePerRequestFilter

@Component
@RequiredArgsConstructor
public class MyFilter extends OncePerRequestFilter {

    private final ObjectMapper mapper;

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

        Map<String, Object> errorDetails = new HashMap<>();
        errorDetails.put("message", "Invalid token");

        httpServletResponse.setStatus(HttpStatus.FORBIDDEN.value());
        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);

        mapper.writeValue(httpServletResponse.getWriter(), errorDetails);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于普通的 servlet Filter,解决方案大致相同:

@Component
@RequiredArgsConstructor
public class MyFilter implements Filter {

    private final ObjectMapper mapper;

    @Override
    public void init(FilterConfig filterConfig) {

    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException {

        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;

        Map<String, Object> errorDetails = new HashMap<>();
        errorDetails.put("message", "Invalid token");

        httpServletResponse.setStatus(HttpStatus.FORBIDDEN.value());
        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);

        mapper.writeValue(httpServletResponse.getWriter(), errorDetails);
    }

    @Override
    public void destroy() {

    }
}
Run Code Online (Sandbox Code Playgroud)

上面的示例依赖于构造函数注入并使用 Lombok@RequiredArgsConstructor生成一个构造函数,该构造函数接收标记为 的字段的值final

您还可以Map<String, Object>根据需要替换任意 POJO 的 。