美文网首页
Tomcat + Spring 处理 “ClientAbortE

Tomcat + Spring 处理 “ClientAbortE

作者: letonode | 来源:发表于2017-01-05 14:02 被阅读1005次

    在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 处理 “ClientAbortE

          本文链接:https://www.haomeiwen.com/subject/lolzvttx.html