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