Как закрыть HTTP-соединение из HttpServlet - PullRequest
10 голосов
/ 24 июня 2010

Я запускаю сервлет в Tomcat 6.0.26. Сервлет принимает загрузку файла с клиента по HTTP POST. Я бы хотел остановить загрузку файлов со стороны HttpServlet. Я попробовал следующие методы без удачи:

  1. закрыть запрос inputtream
  2. отправить код ошибки HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE и сбросить ответ
  3. сделать 1 и 2 в фильтре

Я гуглил, но не нашел прямых ответов. Посоветуйте пожалуйста решения.

Спасибо.

Ответы [ 4 ]

5 голосов
/ 05 июля 2010

Это невозможно при использовании стандартного Servlet или API Commons FileUpload. По сути, чтобы иметь возможность немедленно прервать соединение, вы должны физически взять базовый сокет и закрыть его. Однако этот сокет контролируется веб-сервером. См. Также этот связанный вопрос: Как явно прекратить http-соединение с сервера без заголовка ответа .

Однако небольшие тесты подтвердили, что Commons FileUpload не буферизует весь файл в памяти, когда его размер превышает ограничение. Он будет читать входной поток, но просто проигнорирует и выбросит прочитанные байты (также те, которые уже прочитаны). Таким образом, эффективность памяти не обязательно проблема здесь.

Чтобы исправить реальную проблему, вы, в основном, хотели бы проверить размер файла на стороне клиента, а не на стороне сервера. Это возможно с помощью Java-апплета или приложения Flash. Например, соответственно JumpLoader и SWFUpload .

4 голосов
/ 07 июля 2010

Это невозможно при использовании стандартных API.И вы нарушаете некоторые стандарты протокола / RFC, если вы делаете.Так зачем вам это делать?

Вместо этого отправьте ответ «Connection: close» (заголовок http) без тела http.

3 голосов
/ 06 июля 2010

вот несколько сумасшедший обходной путь: вы можете написать (или найти где-нибудь) какое-нибудь автономное приложение брандмауэра на основе сокетов, которое обрабатывает HTTP-запрос, анализирует заголовки и, если запрос соответствует некоторым вашим пользовательским условиям - брандмауэр перенаправляет его в Tomcat, в противном случае возвращает HTTP ответ об ошибке. Или вы можете попытаться настроить Apache <-> Tomcat с некоторыми правилами Apache.

1 голос
/ 24 июня 2010

Вопрос является в большей или меньшей степени дубликатом Прерывание загрузки из сервлета для ограничения размера файла

Вы пытались использовать Apache Commons FileUpload ?

В объекте сервера есть метод setFileSizeMax, представляющий загрузку файла из запроса.

...