ClientAbortException в приложении, развернутом в jboss с браузером IE8 - PullRequest
6 голосов
/ 20 марта 2012

У меня следующее исключение для приложения, развернутого в Jboss, браузер IE8

2012-03-19 09:17:12,014 WARN  [org.apache.catalina.core.ContainerBase.jboss.web].         [localhost]] Exception Processing ErrorPage[errorCode=404, location=/internalError.jsp]
ClientAbortException:  java.net.SocketException: Broken pipe
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:327)

Кажется, браузер закрыл сокет, прежде чем сервер записал в него internalError.jsp. Пожалуйста, предложите, как решить эту проблему, или хотя бы как я могу скрыть это исключение.

Спасибо Hikumar

1 Ответ

18 голосов
/ 20 марта 2012

Вы не можете решить это. Вы не можете контролировать, будет ли клиент нажимать клавишу Esc, или поспешно щелкнет другую ссылку, или закроет браузер, или произойдет сбой его машины, и так далее, пока ваш сервер все еще обрабатывает запрос / ответ HTTP.

Вы можете «спрятать» его с помощью глобального фильтра (сопоставленного с /*), который делает что-то вроде этого:

try {
    chain.doFilter(request, response);
}
catch (ClientAbortException e) {
    // Ignore.
}

Это, однако, приводит к зависимости вашего сервлетконтейнера от кода. Рассматриваемый фильтр может привести к NoClassDefFoundError на контейнере сервлетов другой марки, который не использует Tomcat ClientAbortException. Вы можете вместо этого проверить простое имя класса. Воспользуйтесь тем преимуществом, что это подкласс IOException:

try {
    chain.doFilter(request, response);
}
catch (IOException e) {
    if (!e.getClass().getSimpleName().equals("ClientAbortException")) {
        throw e;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...