Tomcat + Spring 处理 “ClientAbortException” 引发的Broken pipe

在Tomcat环境中,如果用户端主动放弃了请求,但是服务端尚未处理完成时,Tomcat会抛出一个"ClientAbortException"的 "IOException"。在Spring MVC框架中如何处理它显得有点棘手,这里将会简单说明如何进行处理。

为什么这个问题会显得比较棘手?

在Spring MVC框架中我们一般会使用 "@ExceptionHandler"的注解来处理异常。通常情况下,异常被转发到一个集中的处理方法中,进行合适的处理后返回给前端。但是出现上图这种情况时,我们就无法再将response信息给返回回去了,因为用户端的请求已经close掉了。

解决方法

我们在"@ExceptionHandler"方法里面捕捉到IOException且内容为"Broken pipe"的异常后,返回一个`null`给Spring框架,这样框架层面就不会进行任何处理,也就不引发"JasperException"了。

```

@ExceptionHandler(IOException.class)

@ResponseStatus(HttpStatus.SERVICE_UNAVAILABLE)  //(1)

public Object exceptionHandler(IOException e, HttpServletRequest request) {

if (StringUtils.containsIgnoreCase(ExceptionUtils.getRootCauseMessage(e), "Broken pipe")) {  //(2)

return null;        //(1)    socket is closed, cannot return any response

} else {

return new HttpEntity<>(e.getMessage());  //(3)

}

}

```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容