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

Tomcat + Spring 处理 “ClientAbortException” 引发的Broken pipe_第1张图片

在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)

}

}

```

你可能感兴趣的:(Tomcat + Spring 处理 “ClientAbortException” 引发的Broken pipe)