Как вы можете узнать, нажал ли пользователь кнопку отмены во время загрузки из сервлета Java?
Как вы можете узнать, нажал ли пользователь кнопку отмены во время загрузки из сервлета Java? То, что, похоже, происходит для меня с IE, выводит поток println(). Используемый хит отменяет, но есть ли способ рассчитать время или что-то подобное?
2 ответа
Заворачивать OutputStream#write()
, #flush()
а также #close()
в try-catch
блок на IOException
, Если его поймали, то это обычно означает, что конечный пользователь прервал запрос.
Чтобы продвинуться дальше, вы также можете поймать исключение, более специфичное для servletcontainer, например: ClientAbortException
на Tomcat и клонов (который является подклассом IOException
), но это сделает код вашего веб-приложения непереносимым для других контейнеров сервлетов.
Обновление: чтобы вернуться к вопросу блокировки, вы хотите позвонить flush()
после записи одного блока данных. Это фактически отправит данные клиенту и вызовет IOException
когда основной сокет закрыт.
Вы не сможете сказать наверняка. Это зависит от того, как реализован ваш контейнер сервлетов.
Когда пользователь нажимает кнопку "Отмена", браузер должен закрыть сокет. Конечно, это будет обнаружено сервером, но есть ли у сервера ServletOutputStream
"подключен" прямо к розетке OutputStream
зависит от реализации. Если это так, IOException
будет поднят в следующий раз, когда сервлет попытается записать данные.
Если контейнер буферизирует вывод, сервлет может просто завершить запись данных и никогда не знать, что что-то пошло не так.