В чем разница между 8 и 9 версиями Tomcat, что мой запрос работает в 8, а в 9 нет?
Я думаю, что разница в том, что Tomcat 9.x ужесточилсячто должно быть разрешено быть незакодированным в URL, поэтому с технической точки зрения нет проблем с Tomcat 9.x;проблема связана с более ранними выпусками Tomcat, и браузеры не строго следуют спецификациям.
Тем не менее, я не смог определить какое-либо конкретное исправление, которое вызвало эту проблему для вас, и не смог увидеть ничего в Замечания к выпуску .
Я добавляю параметр relaxedQueryChars в коннектор Tomcat с двоеточием (хотя двоеточие разрешено символом) ... и он по-прежнему не работает.
С документация Tomcat 9.0 для relaxedQueryChars
:
Спецификация HTTP / 1.1 требует, чтобы определенные символы кодировались в% nn при использовании в строках запроса URI. К сожалению, многие пользовательские агенты, включая все основные браузеры, не соответствуют этой спецификации и используют эти символы в незашифрованном виде. Чтобы предотвратить отклонение таких запросов Tomcat, этот атрибут может использоваться для указания дополнительных разрешенных символов. Если не указано, дополнительные символы не будут разрешены. Значение может быть любой комбинацией следующих символов: "<> [\] ^` {|}. Любые другие символы, присутствующие в значении, будут игнорироваться.
Примечаниепоследние два предложения. Символ двоеточия не упоминается, поэтому он " будет игнорироваться ".
Могу ли я что-нибудь сделать в Tomcat, чтобы этот запрос работал?
Я так не думаю, но настоящая проблема в том, что вы не кодируете двоеточия в своих параметрах, и вы уже упоминали, что это решает проблему. См. Этот SO-ответ и, в частности, последнее предложение:
There are reserved characters, that have a reserved meanings, those are delimiters — :/?#[]@ — and subdelimiters — !$&'()*+,;=
There is also a set of characters called unreserved characters — alphanumerics and -._~ — which are not to be encoded.
That means, that anything that doesn't belong to unreserved characters set is supposed to be %-encoded, when they do not have special meaning (e.g. when passed as a part of GET parameter).
Двоеточие - это зарезервированный символ со специальным значением, и поэтому оно должно быть закодировано в ваших параметрах.
Примечания: