0

我正在将 Spring/Angular 应用程序从 Tomcat 7.0.59 升级到 7.0.99。我正在使用嵌入式 Tomcat 服务器并从命令行运行应用程序(“tomcat7:run-war”)。

问题是默认欢迎文件被添加到上下文中(来自 Tomcat.initWebappDefaults())。Tomcat 代码在 Tomcat.addWebapp 中添加了一个defaultWebXmlListener,它添加了一堆东西,包括“index.html”、“index.htm”和“index.jsp”。我希望删除 index.html 和 index.htm,但嵌入式 Tomcat 正在强制它们进入。正在找到我的应用程序的web.xml 但欢迎文件被附加到列表中,而不是替换。

当我从命令行运行 tomcat 7.0.59 时,它工作正常并且不会添加额外的欢迎文件。

当我使用外部服务器从 IntelliJ 内部运行 tomcat 7.0.99 时,它工作正常并且不会添加额外的欢迎文件。

4

1 回答 1

0

所以有两件事: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 方法中完成。

于 2020-03-12T15:28:50.693 回答