Как вы можете узнать, нажал ли пользователь кнопку отмены во время загрузки из сервлета Java? - PullRequest
4 голосов
/ 09 сентября 2010

Как узнать, нажал ли пользователь кнопку отмены во время загрузки из сервлета Java? То, что, похоже, происходит для меня с IE, выводит поток println (). Используемый хит отменяет, но есть ли способ отмерить это или что-то подобное?

Ответы [ 2 ]

4 голосов
/ 09 сентября 2010

Обернуть OutputStream#write(), #flush() и #close() в блоке try-catch на IOException. Если его поймали, это обычно означает, что конечный пользователь прервал запрос.

Чтобы продвинуться дальше, вы также можете поймать исключение, более специфичное для сервлет-контейнера, например ClientAbortException для Tomcat и клонов (который является подклассом IOException), но это сделает Код веб-приложения, недоступный для других контейнеров сервлетов.


Обновление : чтобы вернуться к проблеме блокировки, вы должны позвонить flush() после записи одного блока данных. Это на самом деле отправит данные клиенту и вызовет IOException при закрытии основного сокета.

2 голосов
/ 09 сентября 2010

Вы не сможете сказать наверняка.Это зависит от того, как реализован ваш контейнер сервлетов.

Когда пользователь нажимает «Отмена», браузер должен закрыть сокет.Конечно, это будет обнаруживаться сервером, но то, будет ли сервер ServletOutputStream «подключен» непосредственно к сокету OutputStream, зависит от реализации.Если это произойдет, IOException будет поднят в следующий раз, когда сервлет попытается записать данные.

Если контейнер буферизирует вывод, сервлет может просто завершить запись данных и никогда не узнает, что что-то пошло не так.

...