Как закрыть HTTP-соединение от HttpServlet

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

  1. закройте запрос inputstream
  2. отправьте коду ошибки HttpServletResponse. SC_REQUEST_ENTITY_TOO_LARGE и ответ сброса
  3. сделайте 1 и 2 в Фильтре

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

Спасибо.

10
задан Jason 24 June 2010 в 06:21
поделиться

4 ответа

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

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

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

5
ответ дан 3 December 2019 в 23:48
поделиться

Вопрос более или менее дублирует Aborting upload from a servlet to limit file size

Пробовали ли вы использовать Apache Commons FileUpload?

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

1
ответ дан 3 December 2019 в 23:48
поделиться

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

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

4
ответ дан 3 December 2019 в 23:48
поделиться

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

3
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: