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

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

  • закрыть входной поток запроса
  • отправить код ошибки HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE и сбросить ответ
  • сделать 1 и 2 в фильтре

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

Спасибо.

Ответ 1

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

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

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

Ответ 2

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

Вместо этого отправьте ответ "Соединение: закрыть" (http-заголовок) без тела http.

Ответ 3

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