无法从响应过滤器抛出错误



我试图实现一个过滤器来修改我的api响应的响应。我也有一些过滤器来修改我的请求,它工作得很好。

下面是我的过滤器

public class ResponseFilter implements Filter {
private static final Logger LOGGER = LogManager.getLogger(ResponseFilter.class);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
chain.doFilter(request, response);
httpResponse.sendError(HttpStatus.SC_BAD_REQUEST, "Error while extract....");
}
}

过滤器注册Bean

@Configuration
public class FilterBean {
private static final Logger LOGGER = LogManager.getLogger(FilterBean.class);

@Value("${filter.urls}")
private String filterUrls;
@Bean
public FilterRegistrationBean<ResponseFilter> responseFilter() {
FilterRegistrationBean<ResponseFilter> registrationBean = new FilterRegistrationBean<>();
LOGGER.debug("Inside responseFilter Bin....*********");
registrationBean.setFilter(new ResponseFilter());
registrationBean.addUrlPatterns(filterUrls.split(","));
return registrationBean;
}
}

下面的是例外

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:456) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
at com.example.filter.ResponseFilter.doFilter(ResponseFilter.java:41) ~[classes/:?]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.8.jar:5.3.8]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.8.jar:5.3.8]

谁能帮帮我,在它到达调用者之前拦截响应。

通常,调用doFilter意味着将ServletRequestServletResponse传递到下一个过滤器(在FilterChain对象中)。所以当你尝试发送错误时,你得到Cannot call sendError() after the response has been committed(你已经通过doFilter提交了你的响应)。

因此,如果您希望将请求传递给控制器并返回HttpStatus.BAD_REQUEST,据我所知,您不能这样做。

相关内容

最新更新