Я столкнулся со странной проблемой.У нас есть старое приложение, которое было написано и развернуто на Tomcat 6. И теперь наша команда безопасности сказала, что Tomcat 6 - это EOL, и нам нужно перейти на новую версию Tomcat.
Я решил перенести это приложение с версии наверсии и с Tomcat 7 я столкнулся со странной проблемой.
В пользовательском интерфейсе у нас есть много различных HTML-форм, и некоторые поля в этих формах могут быть пустыми.С tomcat 6 такие поля были интерпретированы как нулевые значения.После перехода на tomcat 7 я получаю пустую строку вместо нулевого значения.
После некоторого поиска в Google я обнаружил, что люди предлагают указать такой параметр в web.xml:
<context-param>
<param-name>org.apache.el.parser.COERCE_TO_ZERO</param-name>
<param-value>false</param-value>
</context-param>
И это непомог
Также хочу упомянуть, что мы также используем Spring MVC в этом приложении.Но во время миграции я не изменил ни одну версию кода.Единственное, что я изменил, это версия tomcat
Обновление
Я обновил tomcat до последней доступной докеризированной версии (9.0.16-jre8).В результате у меня остается та же проблема.
Обновление 2
У меня нет неограниченного времени для этого билета, поэтому я решил вручную обновить / заменить все места, где мыпроверьте поля на null, чтобы начать, проверьте пустое значение.
Также я обнаружил, что начиная с версии 7 tomcat использует относительный путь для ссылок перенаправления, а в версии 6 Tomcat использует абсолютные ссылки по умолчанию (или он был настроен с некоторыми устаревшимиполе / свойство, которое было удалено в версии 7).
Если вы хотите включить логику для абсолютного пути, вам нужно указать атрибут useRelativeRedirects
в конфигурации контекста:
<Context useRelativeRedirects="false" />
Еще один момент -что начиная с Tomcat 8 он поддерживает Rfc6265 и выдает исключение, если ваши куки имеют недопустимый формат (в нашем случае у нас есть куки, которые начинаются с .
).В данный момент Tomcat поддерживает устаревший процессор cookie, но его можно удалить в будущих версиях.Чтобы включить устаревший процессор cookie, вам необходимо добавить такую строку в конфигурации контекста:
<Context useRelativeRedirects="false">
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
</Context>
Следующая вещь, также связанная с некоторыми новыми спецификациями, - это формат URL и параметры запроса.В случае, если вы запрашиваете в params какие-то специальные символы, запрашиваемые вами сбои в новых версиях Tomcat, а в логах вы просто увидите null
вместо URL запроса.Чтобы это исправить, вам нужно добавить атрибут elaxedQueryChars
для Connector
в server.xml следующим образом:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443"
elaxedQueryChars="<>[\]^'{|}"/>
<>[\]^'{|}
== <>[\]'{|}
И последнее, что яОбнаружено, что некоторые слушатели, которые использовались в Tomcat6, были удалены в Tomcat7 +.Например, я удалил такие строки из server.xml:
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.core.JasperListener" />
Еще одна вещь.В новых версиях Tomcat у нас большой список банок, указанный в tomcat.util.scan.StandardJarScanFilter.jarsToSkip
.При списке по умолчанию jstl
библиотека перестает работать, так как по умолчанию она пропускается.Поэтому вам нужно удалить строки, связанные с jstl
: