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