В редких случаях мы получаем следующую ошибку в нашем производственном веб-приложении, работающем на Tomcat 8 и написанном на Spring / SpringMVC с Ajax-запросами от JS:
Caused by: java.io.IOException: Broken pipe
at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
Ошибка возникает при очень маленьком Ajax-запросеНичего большого, только дюжина или около того полей в строке JSON.
Из исследования я понимаю, что эта "безвредная" ошибка вызвана тем, что клиент закрывал браузер перед отправкой ответа. Другими словами, преждевременное закрытие браузера, пока операция еще продолжалась: https://stackoverflow.com/a/51809667/1005607
Это не ошибка логики вашего приложения. Это просто из-за поведения пользователя. В вашем коде нет ничего неправильного как такового.
Есть две вещи, которые вы можете сделать:
Ignore this specific exception so that you don't log it.
Но я не понимаю: это такаяЧасто ли мы пишем все наши веб-приложения, чтобы всегда ловить это исключение "Сломанной трубы"? Очень часто преждевременно закрывать браузеры, разве не каждая отдельная операция защищает от этого путем перехвата этого исключения всегда ? Это первый раз, когда я слышу об общей уязвимости ввода / вывода, которая, похоже, «должна» обнаруживаться при каждой возможной веб-операции! Как правильно надежно охранять это событие?