假设您将 Jackson 的 ObjectMapper 公开为 Spring bean,您可以将以下内容用于 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);
}
}
对于普通的 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() {
}
}
以上示例依赖于构造函数注入,并使用 Lombok 的 @RequiredArgsConstructor 生成构造函数,该构造函数接收标记为 final 的字段的值。
您还可以根据需要将Map<String, Object> 替换为任意 POJO。