Запрос, возвращающий 400 неверных запросов в Tomcat 8

#java #http #tomcat #urlencode

Вопрос:

У меня есть веб-приложение Java, развернутое в tomcat.

Я получаю 400 неверных запросов от Tomcat 8, если мой URL такой

 https://<serverurl>?cmisSelector=objectamp;objectId=TyNGT0wjJSMwMDAjMDAjIyMjamp;filter=cmis:createdBy,a:b:ab,a:b:abcamp;renditionFilter=cmis:thumbnail,application/pdf,image/bmp,image/gif,image/jpeg,image/png
 

Который кодируется как

 https://?cmisSelector=object&objectId=TyNGT0wjJSMwMDAjMDAjIyMj&filter=cmis:createdBy,a:b:ab,a:b:abc&renditionFilter=cmis:thumbnail,application/pdf,image/bmp,image/gif,image/jpeg,image/png
 

Но если я удалю a:b:ab,a:b:abc и renditionFilter=cmis:миниатюра,приложение/pdf,изображение/bmp,изображение/gif,изображение/jpeg,изображение/png из URL-адреса, то это сработает, этот URL будет сформирован, как показано ниже

 https://<serverurl>?cmisSelector=objectamp;objectId=TyNGT0wjJSMwMDAjMDAjIyMjamp;filter=cmis:createdBy
 

Кажется, есть какая-то проблема с кодировкой URL, но я не могу выяснить точную проблему.

Комментарии:

1. Разве мы не должны сбежать от : с : ?

2. да, это происходит только с :

3. Попробуй https://<serverurl>?cmisSelector=objectamp;objectId=TyNGT0wjJSMwMDAjMDAjIyMjamp;filter=cmis:createdBy,a:b:ab,a:b:abcamp;renditionFilter=cmis:thumbnail,application/pdf,image/bmp,image/gif,image/jpeg,image/png

Ответ №1:

По умолчанию Tomcat возвращает HTTP-неверный запрос (400), если URL-адрес содержит прямую или обратную косую / черту (/) и () соответственно. Это делается в качестве меры безопасности.

Вы можете отключить эту функцию и разрешить эти символы, установив следующие системные свойства (например, в catalina.properties или в CATALINA_OPTS ).:

 -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

### You may not need this one, as you only have forward slashes
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true
 

Комментарии:

1. В недавних Tomcats было бы лучше использовать encodedSolidusHandling атрибут на вашем <Connector> , а не системном свойстве, потому что его можно устанавливать для каждого соединителя, а не глобально.