java.lang.IllegalArgumentException: Неправильний символ, знайдений у назві методу. Імена методу HTTP повинні бути лексемами


161

Я отримую нижче сліду стека, коли я розгортаю свою програму в багатосерверному середовищі Apache Tomcat 8. Я часто отримую цю помилку, і, здається, вона блокує нитку tomcat:

INFO [http-nio-80-exec-4461] org.apache.coyote.http11.AbstractHttp11Processor.process 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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:233)
 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.lang.Thread.run(Unknown Source)

Чи може хтось направити мене, як усунути та звузити таке вилучення? Я не отримую посилання на жоден із моїх вихідних файлів додатків. Я намагався погукати, і в посиланнях, на яких він говорив, ви намагаєтеся отримати доступ до URL-адреси http через https, що здається малоймовірним. Я не отримую цієї помилки, коли програма працює на одному екземплярі Tomcat 8. Я отримую це лише в середовищі з декількома серверами.

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

<%
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Cache-Control", "no-store");
    response.setDateHeader("Expires", 0);
    response.setHeader("Pragma", "no-cache");
%>


<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1">

Я також використовую наступне на кількох сторінках, що в основному те саме, що вище:

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Cache-Control" content="private" />
<meta http-equiv="Cache-Control" content="no-store" />
<meta http-equiv="Pragma" content="no-cache" />

Навіть якщо хтось допоможе в наданні вказівки на мою спробу усунення несправностей, це буде корисно, тому що наразі я не маю уявлення, куди шукати.

Заздалегідь спасибі.

Відповіді:


266

Цей виняток може виникнути, коли ви намагаєтесь виконати запит HTTPS від клієнта на кінцевій точці, яка не включена HTTPS. Клієнт буде шифрувати дані запиту, коли сервер очікує необроблених даних.


1
Я не впевнений, що розумію цю відповідь. У мене є програма Spring Boot 1.5.1, і цей виняток я бачив у своєму журналі. Мій додаток відповідає лише за SSL на порт 8443 (переспрямований з порту 443) і має лише один роз'єм для SSL. Ви хочете сказати, що хтось може спробувати http: замість https: на порту 443?
Джим Арчер

5
Такі винятки трапляються, коли існує невідповідність між тим, що очікує сервер, і тим, що він отримує. Те, що ви сказали, - це один із можливих сценаріїв. Можливо, на вашому сервері є кінцева точка, яка не працює на https, але хтось намагається отримати доступ до неї таким чином?
Петар Тонєв

1
Привіт Пітер ... Проблема зрештою полягала в тому, що хтось створив правило IP-таблиць, щоб переслати порт 80 на порт 8443, тому кожен, хто потрапив на сайт за допомогою http на порт 80, викликав цю помилку. Ми додали роз'єм Tomcat для переадресації портів 8080 на 8443 і встановив правило IP-таблиць для переадресації порту 80 на порт 8080, і проблема все ще не залишилася. Дякуємо за Вашу відповідь!
Джим Арчер

1
@PeterTonev: Будь-яка ідея, як (перенаправити https на http || відключити https || зловити помилку, щоб принаймні показати змістовне повідомлення про помилку)?
кривавий

1
@crusy Щось, що може вам допомогти тут для обробки винятків, - посилання
Петро Тонев

56

Я отримав той самий виняток, коли пройшов місцеве тестування. Проблемою була схема URL-адреси в моєму запиті.

Зміна https:// to http:// in your client url.

Напевно, це допомагає.


2
Звичайно, це працює, але зауважте, що зв’язок через HTTP не є безпечною.
Paramvir Singh Karwal

23

Ви викликаєте локальний сервер за допомогою http : // localhost: 8080 / foo / bar. Телефонуйте за допомогою https : // localhost: 8080 / foo / bar. Це вирішує проблему


Можливо, у вас не буде https: // на 8080. Змініть виклик на https: // localhost: 8443 / foo / bar - Ось приклад посилання - Rodrigo R. Coelho
Rodrigo R. Coelho

9

У випадку, якщо хтось використовує swagger:

Перед тим, як натиснути на виконання, змініть схему на HTTPабо HTTPSзалежно від потреб.

Листоноша:

Змініть Шлях до URL-адреси http://або https://на адресу URL-адреси


8

Я отримав цей виняток, не пов’язаний із будь-якими проблемами TLS. У моєму випадку значення заголовка довжини вмісту не відповідало довжині тіла.


2
Я не можу вам подякувати достатньо. Кожен інший запит POST провалювався з помилкою 400, і я був готовий зірвати волосся. Виявилося, що невідправлення content-lengthзаголовка вирішує цю проблему.
Олександр Вудблок

2
Я отримував затримку на 30-90сек для запитів листоноші до місцевих розробників - виявляється, це було саме це питання! Вимкнення Content-Lengthзаголовка виправлено затримку.
Алок

1

Відповідаючи на це старе запитання (для інших, що може допомогти)

Налаштування вашого httpd conf призведе до вирішення проблеми. Встановіть будь-який сервер httpd, якщо у вас його немає.

Список моїх конфігурацій тут.

[smilyface@box002 ~]$ cat /etc/httpd/conf/httpd.conf | grep shirts | grep -v "#"


        ProxyPass /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPassReverse /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPass /shirts http://local.box002.com:16443/shirts
        ProxyPassReverse /shirts http://local.box002.com:16443/shirts
        ...
        ...
        ...

відредагуйте файл, як описано вище, а потім перезапустіть httpd, як показано нижче

[smilyface@box002 ~]$ sudo service httpd restart


І тоді запит з допомогою httpsбуде працювати без винятку.
Також запит з httpбудемо пересилати до https! Не хвилюйтесь.


1

Цю помилку я вирішив, виконавши 2 речі в хромовому браузері:

  1. Натиснуті Ctrl + Shift + Видалити та очистити всі дані перегляду від початку.
  2. Перейдіть до Chrome: Settings -> Advanced Settings -> Open settings proxy -> Internet Properties, потім перейдіть до вікна Content і натисніть кнопку Clear SSL State.

Цей веб-сайт також містить цю інформацію та інші параметри: https://www.thesslstore.com/blog/fix-err-ssl-protocol-error/


1

Я знаю, що це стара тема, але є певний випадок, коли це може статися:

Якщо ви використовуєте AWS-шлюз api в поєднанні з VPC-посиланням, і якщо Network Load Balancer має ввімкнутий протокол v2-проксі, також відбудеться 400 поганий запит.

Мене цілий день обходили, щоб розібратися, тому, якщо це може комусь допомогти, я буду радий :)


0

Я отримував те саме виняток, коли сторінка завантажувалася,

NFO: 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.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:139)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

Я виявив, що одна з моїх сторінок URL була https замість http, коли я змінив те саме, помилка не стала.


0

Зазвичай це відбувається, коли ви використовуєте схему URI, яка не підтримується сервером, на якому розгорнута програма. Отже, ви можете або перевірити, які всі схеми підтримує ваш сервер, і відповідно змінити ваш запит URI, або, можливо, ви захочете додати підтримку цієї схеми на своєму сервері. Обсяг вашої програми повинен допомогти вам вирішити це питання.


0

Сталося зі мною, коли у мене був той самий порт, який використовувався в ssh тунелі SOCKS для запуску проксі на порту 8080, а мій сервер і мій проксі-браузер Firefox були встановлені на цей порт і отримали цю проблему.


0

У моєму випадку мені довелося очистити історію браузера / файли cookie, щоб позбутися цієї помилки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.