SpringBoot - Ошибка при разборе заголовка HTTP-запроса

Я запускаю SpringBoot Application, только что проверил журналы сервера и получил несколько подобных ошибок. Я не могу понять, что может вызвать это, поскольку ошибка появляется каждый день через 12/24 часов.

Версия Tomcat, работающая на 8.5.11

2018-03-04 17:03:26 [http-nio-8080-exec-85] INFO  o.a.coyote.http11.Http11Processor - Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:421)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:667)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

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

hovanessyan 14.03.2018 10:26

Эта ошибка может возникнуть, если вы пытаетесь получить доступ к незащищенной странице через https.

abdul 14.03.2018 10:36

@hovanessyan да, это причина публикации его здесь, он появляется только в продакшене, и я не думаю, что это вызвано чьим-то звонком, поскольку это происходит с тем же интервалом.

Mikheil Janiashvili 14.03.2018 10:38

@MishoJaniashvili - публикация журналов из производственной среды без контекста не приведет ни к чему, кроме предположения, что может вызвать ошибку - «ошибки синтаксического анализа будут регистрироваться на уровне DEBUG» - я предлагаю включить DEBUG в производственной среде на следующие 24 часа

hovanessyan 14.03.2018 10:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
14
4
45 521
4

Ответы 4

Это может произойти из-за анализа заголовков HTTPS вместо HTTP. Пытаться:

  1. Добавление:
    logging.level.org.springframework.web: trace
    logging.level.org.apache: trace
    в свой application.properties и посмотрите, что говорит вам Spring.
  2. Проверьте, есть ли в это время какие-либо запланированные действия, относящиеся к другому ресурсу, зашифрованному с помощью SSL. См. Также: java.lang.IllegalArgumentException: в имени метода обнаружен недопустимый символ. Имена методов HTTP должны быть токенами

У меня была эта ошибка в приложении Spring Boot 2 (2.0.1.RELEASE), которое было настроено для обслуживания HTTPS на порту 8443 и перенаправления HTTP-трафика порта 8080 на порт 8443.

В Microsoft Edge приложение работало, как и ожидалось, с перенаправлением http://localhost:8080 на https://localhost:8443. Однако в Chrome 66 это сработает только один раз, а затем Chrome будет жаловаться, что «localhost отправил неверный ответ» (ERR_SSL_PROTOCOL_ERROR).

Журнал сервера сказал: DEBUG 11440 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer: Received [ <<unprintable characters>> ] INFO 11440 --- [nio-8080-exec-1] o.apache.coyote.http11.Http11Processor: Error parsing HTTP request header

Оказывается, Chrome добавлял localhost в свой Список HSTS потому что Spring Boot отправил обратно заголовок Strict-Transport-Security: max-age=31536000 ; includeSubDomains для https: // localhost: 8443. По сути, эта проблема возникла из-за того, что клиент (то есть браузер) пытался передать HTTPS конечной точке HTTP.

Добавление .headers().httpStrictTransportSecurity().disable(); в <? extends WebSecurityConfigurerAdapter>.configure исправил проблему, как указано в этот вопрос StackOverflow.

Это не решение ошибки, которую я пытался решить, но это решение другой ошибки, которая у меня была. Мы запускаем все наши приложения на 8080 и 8443 в целях безопасности. В последнее время пользователи жаловались, что не могут подключиться. Их браузеры автоматически перенаправляют на https на: 8080, незащищенный порт соединителя. Думаю, это потому, что мы перешли на весеннюю загрузку.

Mark D 29.04.2020 23:45

Как я ответил в этот похожий вопрос, проверьте, не запрашиваете ли вы случайно протокол HTTPS вместо протокола HTTP. Если вы не настроите SSL на Tomcat и отправите запрос HTTPS, это приведет к этому странному сообщению.

Расскажу, что он решает, когда я использовал Firefox вместо Chrome.

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