在迁移到Tomcat 7后,空字符串已转换为空字符串

时间:2019-03-25 18:15:25

标签: java spring-mvc tomcat servlets

我面临一个奇怪的问题。我们有在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="&lt;&gt;[\]^&apos;{|}"/>

&lt;&gt;[\]^&apos;{|} == <>[\]'{|}

我发现的最后一件事是,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相关的行:

0 个答案:

没有答案