Автор оригинала: David Wong.
I. Предисловие
Быстро получив требование, он завершает и проводит локальные тесты, чтобы обнаружить, что:
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
Поскольку данные параметра в запросе get предназначены для запроса имени человека, он содержит китайский язык, который анализируется.
II. Аналитический процесс
В то время я сразу же проконсультировался с учителем Baidu, потому что Tomcat обновился в версии, следовал спецификации RFC для URL-адресов и не выпускал специальных символов. Существует два направления решения этой проблемы:
1. Решите проблему с кодированием. 2. Версия Tomcat понижена.
Использование postman для переноса китайских параметров позволяет нормально получать доступ к данным и раньше не сталкивался с такой проблемой, поэтому сервер java не является проблемой, и служба использует spring boot 1.5.3, соответствующая версия Tomcat 8.5.14, не рассматривая развертывание как военный пакет, мы намерены начать с кодирования.
На самом деле проблема довольно проста. Но из-за рамок дизайна услуг мы пошли по неправильному пути… Я хочу записать процесс анализа.
Посетите Tomcat с китайскими параметрами с переднего конца. В журнале доступа Tomcat вы можете видеть, что запрос с китайскими параметрами выглядит следующим образом:
[18/Jun/2019:19:51:18 +0800] 0:0:0:0:0:0:0:1 "GET null null" 400 (0 ms)
Запрос был отфильтрован до того, как он поступил.
Я закодировал параметры в JS
window.location.href='?p=ware&d=ware-register-query&agentName='+encodeURI($(".agent").val());Параметры закодированы здесь и признаны бесполезными. Лучшее мышление озадачено.
На самом деле, поскольку мы являемся архитектурой HTML + PHP + java, запросы обрабатываются PHP, а затем отправляются в фон Java. Параметры, закодированные в JS, автоматически декодируются при отправке в обработку PHP:
Var_dump (check_merchant_query.'? Agent Name='. $_GET['agent Name']); // URL of print stitching
$req = new httpRequest('get',check_merchant_query.'?agentName='.$_GET['agentName'],null,function($result){return $result;});Результат, напечатанный здесь, был расшифрован, и в то время я этого не заметил. Я просто подумал, что URL-адрес был правильным, так что это заняло много времени. Учитывая, что параметры get HTTP-запросов, построенных на PHP, были закодированы, в следующий раз я расскажу о том, как настроить Tomcat на выпуск специальных символов.
Если это обычный HTML + java, то приведенное выше кодирование не является проблемой, но когда анализ забыл пройти обработку PHP.
Наконец, мы можем закодировать параметры на Php.
$req = new httpRequest('get',check_merchant_query.'?agentName='.urlencode($_GET['agentName']),null,function($result){return $result;});Почему почтальон может вводить китайские параметры и напрямую обращаться к Tomcat? Поскольку postman похож на браузер, он закодировал параметры при отправке запроса.
Оригинал: “https://developpaper.com/learn-about-a-pit-in-tomcat-in-a-simple-get-request/”