首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理Spring中的ClientAbortException?

如何处理Spring中的ClientAbortException?
EN

Stack Overflow用户
提问于 2016-02-17 08:18:59
回答 2查看 6.7K关注 0票数 7

每当客户端中止连接时,我将按以下方式记录一个ClientAbortException

代码语言:javascript
运行
复制
org.apache.catalina.connector.ClientAbortException: java.io.IOException: APR error: -730053
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:353) ~[catalina.jar:8.0.26]
    at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:317) ~[catalina.jar:8.0.26]
    at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:110) ~[catalina.jar:8.0.26]
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1022) ~[jackson-core-2.6.5.jar:2.6.5]
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:891) ~[jackson-databind-2.6.5.jar:2.6.5]
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:264) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:100) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:222) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]

问:由于我不关心客户端是否中止了连接,所以我希望阻止日志记录。或者,阻止我的应用程序试图准确地返回响应。

我怎么能这么做?

我可以创建某种全局@ExceptionHandler(ClientAbortException.class),但如果捕捉到void,还可以返回void吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-23 11:39:31

由于至少SpringBoot2.3.4(可能在此之前),您可以使用带有@ControllerAdvice注释的类,并使用以下方法:

代码语言:javascript
运行
复制
  @ExceptionHandler(ClientAbortException.class)
  public void handleLockException(ClientAbortException exception, HttpServletRequest request) {
    final String message = "ClientAbortException generated by request {} {} from remote address {} with X-FORWARDED-FOR {}";
    final String headerXFF = request.getHeader("X-FORWARDED-FOR");
    log.warn(message, request.getMethod(), request.getRequestURL(), request.getRemoteAddr(), headerXFF);
  }
票数 4
EN

Stack Overflow用户

发布于 2016-02-17 09:21:32

我也遇到了同样的问题,我无法按照您对Spring和异常处理程序的要求进行操作。有些异常(我想是未经检查的)不会被Spring处理程序讨论。我所做的就是在web.xml中定义一个通用过滤器。

代码语言:javascript
运行
复制
  <!-- Filter for exception handling, for those exceptions don't catched by Spring MVC -->
  <filter>
    <filter-name>LoggerFilter</filter-name>
    <filter-class>com.myproject.commons.filters.ExceptionLoggerServletFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoggerFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

我的过滤器的来源是:

代码语言:javascript
运行
复制
public class ExceptionLoggerServletFilter implements Filter {
  private static Log log = LogFactory.getLog(ExceptionLoggerServletFilter.class);

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
      ServletException {
    try {
      chain.doFilter(request, response);
    } catch (Throwable e) {
      StringBuilder sb = new StringBuilder();
      sb.append("Exception detected in ExceptionLoggerServletFilter:");
      if (e instanceof org.apache.catalina.connector.ClientAbortException) {
        // don't do full log of this error
        sb.append(" ClientAbortException");
        log.error(sb.toString());
      } else {
        log.error(sb.toString(), e);
      }
      throw e;
    }
  }

  @Override
  public void destroy() {
  }

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35451244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档