我面临一个奇怪的问题。我们有在Tomcat 6上编写和部署的旧应用程序。现在,我们的安全团队说Tomcat 6是EOL,我们需要迁移到新版本的Tomcat。
我决定将此应用程序从一个版本迁移到另一个版本,而对于Tomcat 7,我遇到了一个奇怪的问题。
在UI上,我们有许多不同的html表单,并且这些表单中的某些字段可以为空。对于tomcat 6,此类字段被解释为空值。迁移到tomcat 7后,我收到的是空字符串而不是空值。
经过一番谷歌搜索,我发现人们建议在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更新为最新的可用dockerized版本(9.0.16-jre8)。 结果,我仍然遇到同样的问题。
更新2
我没有这张票的无限时间,所以我决定手动更新/替换我们检查null字段的所有位置,以开始检查空值。
我还发现,从版本7开始,tomcat使用相对路径进行重定向链接,而在版本6中,Tomcat默认情况下使用绝对链接(或者它已配置有在版本7中已删除的某些旧字段/属性)。
如果要为绝对路径启用逻辑,则需要在上下文配置中指定useRelativeRedirects
属性:
<Context useRelativeRedirects="false" />
另一点是,从Tomcat 8开始,它支持Rfc6265并在Cookie格式无效时抛出异常(在我们的示例中,我们的Cookie以.
开头)。目前,Tomcat支持旧版Cookie处理器,但可以在以后的版本中将其删除。要启用旧版Cookie处理器,您需要在Context配置中添加以下行:
<Context useRelativeRedirects="false">
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
</Context>
与某些新规范有关的下一件事是URL格式和查询参数。如果查询参数具有某些特殊字符,则您的请求将因新版本的Tomcat而失败,并且在日志中,您只会看到null
而不是请求url。要解决此问题,您需要在server.xml中为elaxedQueryChars
添加Connector
属性,如下所示:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443"
elaxedQueryChars="<>[\]^'{|}"/>
<>[\]^'{|}
== <>[\]'{|}
我发现的最后一件事是,Tomcat7 +中删除了Tomcat6中使用的某些侦听器。例如,我从server.xml中删除了以下行:
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.core.JasperListener" />
还有一件事。在新版本的Tomcat中,我们在tomcat.util.scan.StandardJarScanFilter.jarsToSkip
中指定了许多jar。在默认列表jstl
库停止工作的情况下,默认情况下会跳过该库。因此,您需要删除与jstl
相关的行: