Tomcat 8 не может обрабатывать запрос get с помощью ' / ' в параметрах запроса?
Я использую Tomcat 8. В одном случае мне нужно обработать внешний запрос, поступающий из внешнего источника, где запрос имеет параметры, где он разделен |
.
запрос выглядит так:
http://localhost:8080/app/handleResponse?msg=name|id|
в этом случае я получаю следующую ошибку.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:467)
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:789)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
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:745)
правка 1
он работает с Apache Tomcat 8.0.30, но не с Tomcat 8.5
6 ответов
Это поведение вводится во всех основных выпусках Tomcat:
- котяра 7.0.73, 8.0.39, 8.5.7
для быстрого решения, вы можете перейти на одну из старых версий, или указать (см. ответ Жереми).
на основе список изменений, эти изменения могут повлиять на такое поведение:
Tomcat 8.5.3:
обеспечить запросы с именами методов HTTP, которые не являются токенами (как требуется RFC 7231), отклоняются с ответом 400
Tomcat 8.5.7:
добавьте дополнительные проверки на наличие допустимых символов в строку HTTP-запроса, чтобы недопустимые строки запроса были отклонены раньше.
но в конечном итоге вы хотите кодировать свой URL на клиенте:
encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|")
> http://localhost:8080/app/handleResponse?msg=name%7Cid%7C
или просто строка запроса:
encodeURIComponent("msg=name|id|")
> msg%3Dname%7Cid%7C
это защитит вас от другие проблемные персонажи (список недопустимых символов URI).
Начиная С Tomcat 7.0.76, 8.0.42, 8.5.12 вы можете определить свойство requestTargetAllow
разрешить запрещать символы.
добавьте эту строку в свой catalina.properties
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
денешься. Символ трубы-это тот, который обрабатывался по-разному с течением времени и между браузерами. Например, Chrome и Firefox преобразуют URL-адрес с помощью pipe по-разному при их копировании/вставке. Тем не менее, наиболее совместимым и необходимым с Tomcat 8.5 кажется, чтобы избежать его:
URI кодируется как UTF-8, но Tomcat декодирует их как ISO-8859-1. Необходимо изменить параметры соединителя на сервере.xml и добавьте атрибут URIEncoding="UTF-8".
или отредактируйте этот параметр в своем приложении.свойства
сервер.кот.uri-кодирование=utf-8
параметр tomcat.util.http.parser.HttpParser.requestTargetAllow
устарел с Tomcat 8.5:официальный документ tomcat.
можно использовать relaxedQueryChars / relaxedPathChars
в определении соединителей, чтобы разрешить эти символы:официальный документ tomcat.
мы нашли ту же проблему . Проанализировав вопрос, нашли решение . Ниже приведены подробные сведения о проблеме и решении.
вопрос: Tomcat (7.0.88) бросает ниже исключения, которое приводит к 400 – плохому запросу. Ява.ленг.IllegalArgumentException: недопустимый символ в целевой запрос. Допустимые символы определены в RFC 7230 и RFC 3986. Эта проблема возникает в большинстве версий tomcat начиная с 7.0.88.
решение: (предложено Apache команда):
Tomcat повысил их безопасность и больше не позволяет использовать необработанные квадратные скобки в строке запроса. В запросе у нас есть [,] (квадратные скобки), поэтому запрос отеля не обрабатывается сервером.
В качестве решения ниже приведены шаги, которые необходимо включить, чтобы заставить его работать так, как ожидалось.
1. Нам нужно добавить атрибут relaxedQueryChars под тегом под сервером.xml (%TOMCAT_HOME%/conf)
<Connector port="80"
protocol="HTTP/1.1"
maxThreads="150"
connectionTimeout="20000"
redirectPort="443"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"
relaxedQueryChars="[,]"
/>
- если приложению требуется больше специальных символов, которые не поддерживается tomcat по умолчанию, тогда нам нужно добавить эти специальные символы в атрибут relaxedQueryChars с запятыми, разделенными, как указано выше.