Tomcat 9.0.90升级至9.0.107后MIME类型获取逻辑异常问题咨询
你好,针对你升级Tomcat后遇到的MIME类型获取异常问题,我来帮你梳理分析下:
首先,你观察到的这个行为变化确实有点隐蔽——虽然你查了9.0.107的变更日志没找到明确说明,但这个逻辑调整大概率是Tomcat对Servlet规范中配置优先级的实现细节做了修改。
先逐个解答你的疑问:
如果webapp定义了部分MIME映射,现在必须定义所有需要的类型吗?
从你实际测试的结果来看,当前9.0.107的逻辑是这样的:只要你的webapp自身的web.xml里存在任何自定义的<mime-mapping>,Tomcat就会完全使用应用内的映射表,不再加载合并全局conf/web.xml里的MIME配置了。这和9.0.90版本中“全局+应用配置合并”的逻辑完全不同。这是标准Servlet应用的行为吗?
Servlet规范确实明确了应用级配置优先级高于容器全局配置,但规范并没有强制要求“当应用有自定义MIME映射时,必须完全忽略全局映射”——这更多是容器的实现细节。之前Tomcat采用的是“合并两者配置,应用配置覆盖冲突项”的逻辑,现在改成了“应用有自定义映射时,完全使用应用配置”,这应该是Tomcat团队为了更严格执行“应用配置优先”原则做的调整,但这个变更没有在日志里明确标注,确实容易踩坑。这是Tomcat的bug吗?
很难直接定性为bug,更像是一个未明确说明的行为调整。不过这个变化属于破坏性调整,会影响大量依赖全局MIME映射的应用,你可以考虑到Tomcat的官方bug跟踪平台提交一个反馈,询问官方团队的正式解释,看看他们是否会补充说明到变更日志,或者调整回之前的合并逻辑。
给你几个临时的解决思路:
- 如果你不想在每个应用的
web.xml里重复配置所有MIME类型,可以尝试在应用的context.xml里补充MIME映射配置,或者通过Tomcat的全局context.xml来统一配置(需要测试是否能被应用读取到); - 最简单的临时方案是把全局
conf/web.xml里的所有MIME映射复制到你应用的web.xml中,确保覆盖所有需要的文件类型; - 也可以在代码层面做兼容处理:当
getMimeType()返回null时,手动读取全局conf/web.xml的MIME配置,或者在应用内部维护一份常用的MIME类型映射表,作为兜底逻辑。
内容来源于stack exchange

