所以有两件事:Tomcat 7.0.100 为此添加了一个(某种)修复。根据Bug 62755,“setAddDefaultWebXmlToWebapp”的设置器被添加到 Tomcat.java 以防止添加默认配置。(问题是,我不知道如何在我的应用程序代码中设置这个标志)。
我的实际解决方案是在我的 SpringBootServletInitializer 的 onStartup 期间在上下文中进行一些反思性干预。
public void contextInitialized(ServletContextEvent event) {
//Remove the default welcome files that embedded Tomcat 7.0.99 adds because they become auto-concatenated to requests without a file
try {
final ApplicationContext appCtx = (ApplicationContext) get(ApplicationContextFacade.class, servletContext);
final Context tomcatCtx = (Context) get(ApplicationContext.class, appCtx);
tomcatCtx.removeWelcomeFile("index.html");
tomcatCtx.removeWelcomeFile("index.htm");
} catch (final Exception e) {
e.printStackTrace();
}
}
...
private static Object get(final Class<?> clazz, final Object facade) throws Exception {
final Field field = clazz.getDeclaredField("context");
final boolean acc = field.isAccessible();
field.setAccessible(true);
try {
return field.get(facade);
} finally {
field.setAccessible(acc);
}
}
这也可以在 ServletContextListener.contextInitialized 方法中完成。