Встроенный Tomcat 7.0.99 заставляет файлы приветствия по умолчанию в контексте - PullRequest
0 голосов
/ 11 марта 2020

Я обновляю приложение Spring / Angular с Tomcat 7.0.59 до 7.0.99. Я использую встроенный сервер Tomcat и запускаю приложение из командной строки («tomcat7: run-war»).

Проблема в том, что в контекст добавляются файлы приветствия по умолчанию (из Tomcat.initWebappDefaults ()). Код Tomcat добавляет defaultWebXmlListener в Tomcat.addWebapp, который добавляет несколько вещей, включая «index. html», «index.htm» и «index. jsp». Я хочу, чтобы index. html и index.htm были удалены, но встроенный Tomcat принудительно вводит их. web моего приложения. xml найдено, но файлы приветствия добавляются в список, а не заменяются.

Когда я запускаю tomcat 7.0.59 из командной строки, он работает нормально и не добавляет дополнительные файлы приветствия.

Когда я запускаю tomcat 7.0.99 изнутри IntelliJ с помощью внешнего сервер, он работает нормально и не добавляет дополнительные файлы приветствия.

1 Ответ

0 голосов
/ 12 марта 2020

Итак, две вещи: Tomcat 7.0.100 добавляет (вроде) исправление для этого. Согласно Ошибка 62755 , в Tomcat был добавлен установщик для "setAddDefaultWebXmlToWebapp". java, чтобы предотвратить добавление конфигурации по умолчанию. (Проблема в том, что я не знаю, как установить этот флаг в коде моего приложения.)

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.

...