Дублированный код состояния в ответе

Я обычно развертываю веб-приложения Java на серверах Tomcat и обращаюсь к ним через прокси-сервер Apache, используя proxy_ajp. Дело в том, что в последних настройках (которые в основном одинаковы) я вижу, что код состояния, который я получаю во всех моих запросах, дублируется (т. Е. "Код состояния:200 200"). Я получаю это в каждом браузере, в Postman, и для любого кода состояния, который могу получить, и все, кажется, работает нормально, но я обеспокоен, что мои настройки могут быть не оптимальными.

Хотя я не могу найти решение, я сузил проблему до ajp_proxy, как будто я изменяю

ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/

с:

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

Как и ожидалось, я получаю только один код состояния для своих запросов.

Я искал эту проблему, и я не нашел ничего, даже незначительно связанного с ней, поэтому любая информация будет очень цениться.

Информация о сервере:

  • Версия Apache: Apache/2.4.18 (Ubuntu)
  • Версия Tomcat: apache-tomcat-8.5.13

Заранее спасибо.

3 ответа

Решение

Tomcat 8.5 удалил "фразу причины состояния HTTP" из ответа, так что вы получите HTTP 200 вместо HTTP 200 OK в ответ. Возможно, ваши наблюдения взяты из программного обеспечения, которое дублирует код состояния в фразу причины состояния для отображения.

Как вы соблюдаете код статуса? Вы можете обнаружить, что если вы выполните трассировку протокола, вы увидите, что Tomcat / httpd отправляет только один код состояния.

Это не проблема какого-либо клиентского программного обеспечения, это результат обходного пути, содержащегося в Tomcat для конкретной проблемы AJP от 2008 года: Tomcat Issue Tracker # 45026

Здесь вы можете увидеть соответствующий фрагмент кода org.apache.coyote.ajp.AjpProcessor (Github):

if (sendReasonPhrase) {
    /* ... */
    if (message == null) {
        // mod_jk + httpd 2.x fails with a null status message - bug 45026
        message = Integer.toString(response.getStatus());
    }
    tmpMB.setString(message);
} else {
    // Reason phrase is optional but mod_jk + httpd 2.x fails with a null
    // reason phrase - bug 45026
    tmpMB.setString(Integer.toString(response.getStatus()));
}

Наконец, это означает, что каждый ответ на основе AJP всегда будет содержать фразу причины состояния HTTP - по крайней мере, с номером статуса в качестве содержимого.

Это точно объясняет наблюдаемое поведение ваших двоих ProxyPass сценарии.

Я бы предложил включить отправку фразы причины через sendReasonPhrase атрибут в соединителе AJP, пока вы остаетесь в Tomcat 8.5.

Эти атрибуты также существуют для коннектора HTTP.;-)

На самом деле, как указал Кристофер Шульц, я получаю код состояния как код состояния, так и текст причины состояния.

Получение "двойного" кода состояния - это просто визуальное заблуждение, с которым можно столкнуться при использовании инструментов тестирования API, которые обычно довольно печатаются вместе, как единый фрагмент информации, как кода состояния, так и текста причины состояния.

Другие вопросы по тегам