从Spring Boot Filter发送RESTFUL API JSON响应
我正在使用以下过滤器检查API请求中是否存在特定的HTTP标头。
@Component
@RequiredArgsConstructor
public class HeaderValidationFilter extends OncePerRequestFilter {
private final ObjectMapper objectMapper;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String headerValue = request.getHeader("RANDOM_HEADER");
if(Objects.isNull(headerValue)) {
ResponseEntity<Object> responseToSend = ResponseGen.create("FAILED", "Missing Authentication Header", new Object())));
response.setHeader("Content-Type", "application/json");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getOutputStream().write(responseToSend);
return;
}
filterChain.doFilter(request, response);
}
它将响应返回为JSON,但添加的对象键,例如标题
,statuscode
等,我提供的有效载荷放置在body
中。由于我在项目上定义了标准错误响应,因此我无法返回响应。 (请参阅以下响应)
{
"headers": {},
"body": {
"status": "FAILURE",
"message": "Missing Authentication Header",
"data": {}
},
"statusCode": "UNAUTHORIZED",
"statusCodeValue": 401
}
我希望响应仅以这种格式:
{
"status": "FAILED",
"message": "Missing Authentication Header",
"data": {}
}
我尝试使用@controllerAdvice
fleffers @controllerAdvice @controllerAdvice >由于它是在dispatcherservlet
之前执行的,
有人可以帮助我吗?
I am using following filter for checking if a specific HTTP Header is present on api request.
@Component
@RequiredArgsConstructor
public class HeaderValidationFilter extends OncePerRequestFilter {
private final ObjectMapper objectMapper;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String headerValue = request.getHeader("RANDOM_HEADER");
if(Objects.isNull(headerValue)) {
ResponseEntity<Object> responseToSend = ResponseGen.create("FAILED", "Missing Authentication Header", new Object())));
response.setHeader("Content-Type", "application/json");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getOutputStream().write(responseToSend);
return;
}
filterChain.doFilter(request, response);
}
It returns response as JSON but with added object keys like headers
,statusCode
etc and the payload I provided is placed inside body
. As I have a standard error response defined on the Project, I cannot return the response at it is. (See the following response)
{
"headers": {},
"body": {
"status": "FAILURE",
"message": "Missing Authentication Header",
"data": {}
},
"statusCode": "UNAUTHORIZED",
"statusCodeValue": 401
}
I want the response to be only in this format:
{
"status": "FAILED",
"message": "Missing Authentication Header",
"data": {}
}
I have tried returning using generic exception handler with @ControllerAdvice
but it doesn't capture exception from Filters
as it is executed before DispatcherServlet
Can someone help me out?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您看到的JSON
是您在过滤器中作为响应写入的序列化
响应性
:显然,如果您需要另一种格式的响应,则必须使用序列化的对象作为回应。例如
The JSON you see
is the serialized
ResponseEntity
that you write as a response in your filter:Obviously, if you need a response in another format you'll have to use an object that is serialized to the desired format as a response. E.g.