在 spring 休息中,我需要从过滤器类的 doFilter() 发送身份验证错误。作为回应,我需要发送带有状态、消息和错误代码等字段的 json。请建议如何实现。我们没有使用 spring boot.Below 是关于身份验证错误的示例响应
{ "responseCode":"错误代码",
"responseMessage": "一些错误信息",
"responseStatus":"失败"
}
在 doFiler() 中,我正在验证 token ,如果它无效,我需要发送上面的示例响应。
最佳答案
假设你有 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() {
}
}
上面的例子依赖构造函数注入(inject),使用了Lombok的
@RequiredArgsConstructor
生成一个构造函数,该构造函数接收标有 final
的字段的值。 .您也可以更换
Map<String, Object>
根据您的需要,对于任何任意 POJO。
关于spring - 如何从 Spring 过滤器返回响应为 Json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57194249/