Отправка 100, продолжить использование Java Servlet API

Можно ли отправить код состояния HTTP «100 Continue», а затем другой код состояния после обработки всего запроса с использованием Java Servlet API (HttpServletResponse)?

Я не могу найти однозначного ответа «Нет», хотя API, похоже, его не поддерживает.


person Peter Štibraný    schedule 11.05.2009    source источник


Ответы (4)


Я полагаю, вы имеете в виду «100 Продолжить».

Ответ: нет, нельзя (по крайней мере, не так, как задумано, поскольку предварительный ответ). Как правило, механизм сервлетов будет делать это автоматически, когда этого требует запрос. Конечно, это делает невозможным для сервлета предотвратить отправку статуса 100 - эта проблема является известной проблемой в Servlet API, и она была известна, по ощущениям, уже эоны.

person Julian Reschke    schedule 11.05.2009
comment
Спасибо за ответ, Джулиан. Я хотел использовать его в сочетании с библиотекой Apache Jackrabbit Webdav, чтобы запретить клиенту Windows mini-redir отправлять огромные запросы PUT, которые не могут быть обработаны (поскольку отсутствует заголовок авторизации). Хотя я вижу, что в запросе нет заголовка Expect: 100-continue, я все равно хотел его попробовать ... но я не знал, как его кодировать с помощью сервлетов :-( - person Peter Štibraný; 11.05.2009
comment
Я исправил свой вопрос, чтобы говорить о 100 continue, а не о 101 ;-) Теперь я знаю, почему я ничего не нашел в Google при поиске сервлета 101 Continue - person Peter Štibraný; 11.05.2009

Я знаю, что Jetty будет ждать, пока getReader () или getInputStream () вызывается перед отправкой 100. Я думаю, что это именно то поведение, которое вы ищете. Я не знаю, что делает Tomcat.

person Michael Slattery    schedule 15.09.2010
comment
В рамках спецификации это выглядит неплохо. Хорошо знать об этом. Спасибо. - person Peter Štibraný; 16.09.2010

Вы хотели спросить Как отправить код состояния до получения полного запроса, чтобы прервать выполняющийся запрос из-за отсутствия поля заголовка? Кажется, что это невозможно со стандартными сервлетами.

Какой сервер вы используете?

Некоторые расширения сервлетов сервера могут допускать это, например Сервлет Tomcat Comet может отправить EventType.BEGIN, как только заголовки станут доступны для процесс, который может позволить вам прервать PUT, не имеющий правильной аутентификации.

В качестве альтернативы на вашем сервере может быть плагин для отклонения запросов на основе заголовков.

person Kieran Tully    schedule 12.05.2009
comment
Вы хотели спросить, как мне отправить код состояния до завершения запроса ?. - Да, именно это я и имел в виду. Думаю, разработчики API не хотели усложнять только один код состояния, чтобы мы могли его отправить, хотя и не намеренно. - person Peter Štibraný; 13.05.2009
comment
Мы используем Tomcat 5.5 за HTTP-сервером Apache (действующий как обратный прокси). Спасибо за идеи, проверю. - person Peter Štibraný; 13.05.2009

Вы имеете в виду код статуса 100?

API поддерживает отправка SC_CONTINUE.

person Kieran Tully    schedule 11.05.2009
comment
Отправляя 100 Continue клиенту, вы сообщаете клиенту, что он может продолжить отправку тела запроса. После обработки тела запроса вам необходимо отправить другой статус, чтобы указать, что произошло с вашей обработкой. По сути, это означает, что вы отправляете два статуса для одного запроса. - person Peter Štibraný; 11.05.2009
comment
См. greenbytes.de/tech/webdav/rfc2616.html # use.of.the.100.status для получения подробной информации. - person Peter Štibraný; 11.05.2009
comment
Я понимаю, как предполагается использовать код состояния 100 (и фактически я первым опубликовал исправление от 101). Просто кажется странным, что API позволяет вам отправлять его, если вы не можете использовать его по назначению. - person Kieran Tully; 12.05.2009