При весенней загрузке, как мне перенаправить за пределы контекстного пути? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть приложение весенней загрузки, в файле свойств, который я определил:

server.servlet.context-path= /myapp

Если я go до http://localhost/myapp, я вижу все, как ожидалось. Однако, если я go на: http://localhost, я вижу стандартную страницу ошибки 404 из Apache Tomcat.

Как я могу настроить перенаправление с / на /myapp при весенней загрузке?

Альтернативно / эквивалентно: Могу ли я настроить несколько контекстных путей в одном приложении с весенней загрузкой?

Ответы [ 3 ]

4 голосов
/ 10 августа 2020

Ваш вопрос приведет к тому, что приложение будет неправильно указано позже, потому что вы попали на веб-имя и каждый раз приземляетесь на перенаправлении ... Плохой путь к go. Если бы я был вами, я бы с самого начала поставил все правильно: создайте виртуальный хост root внутри вашего Tomcat и обслуживайте ваше приложение с контекстом root "/", а не "/ myapp", если только вы (или ваш клиент , босс) хотите, чтобы это было так ...

Пример конфигурации с VirtualHost с Apache Tomcat: From https://tecadmin.net/create-virtualhost-in-tomcat/

<Host name="example.com"  appBase="webapps" unpackWARs="true" autoDeploy="true">
 <Alias>www.example.com</Alias>
 
 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="example_access_log" suffix=".txt"
           pattern="%h %l %u %t %r %s %b" />
 
 <Context path="" docBase="/opt/tomcat/webapps/myapp1" debug="0" reloadable="true"/>
</Host>

<Host name="mydomain.org"  appBase="webapps" unpackWARs="true" autoDeploy="true">
 <Alias>www.mydomain.org</Alias>
 
 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="mydomain_access_log" suffix=".txt"
           pattern="%h %l %u %t %r %s %b" />
 
 <Context path="" docBase="/opt/tomcat/webapps/myapp2"
    debug="0" reloadable="true"/>
</Host>
1 голос
/ 12 августа 2020

Если вы упаковываете приложение SpringBoot как jar, Tomcat будет включен в качестве встроенного контейнера по умолчанию.

Вы не можете попросить встроенный Tomcat разместить несколько веб-приложений, как то, что он может делать как автономная служба.

Итак, у нас есть два варианта:

  1. Запустить обратный прокси-сервер перед вашим приложением SpringBoot. Например, Nginx

  2. Упакуйте ваше приложение SpringBoot как war и поместите его в какой-нибудь контейнер.

    Например:

    1. Загрузите tomcat и запустите его с конфигурацией по умолчанию.
    2. Создайте my-app-1.0.0-SNAPSHOT.war, переименуйте его в myapp.war и скопируйте в каталог /webapps вашего tomcat.
    3. Вы можете посетить http://localhost:8080/myapp, tomcat может размещать все допустимые папки и войны в /webapps.

PS: Если вы используете Spring Reactive Web (WebFlux, Netty ), второй метод не сработает.

ОБНОВЛЕНИЕ

Вот что я сказал о ServletRegistrationBean в комментариях.

  // use DispatcherServlet here
  private ServletRegistrationBean<? extends Servlet> createServletRegistrationBean(
      ApplicationContext context, String name, String... urlMappings) {
    final DispatcherServlet dispatcherServlet = new DispatcherServlet();
    dispatcherServlet.setApplicationContext(context);

    final ServletRegistrationBean<DispatcherServlet> servletRegistrationBean =
        new ServletRegistrationBean<>(dispatcherServlet, urlMappings);
    servletRegistrationBean.setName(name);
    return servletRegistrationBean;
  }

  @Bean
  public ServletRegistrationBean<? extends Servlet> oneContextPath(ApplicationContext context) {
    // create applicationContext or use the auto configured one
    return createServletRegistrationBean(context, "firstOne", "/*");
  }
  @Bean
  public ServletRegistrationBean<? extends Servlet> anotherContextPath(ApplicationContext context) {
    return createServletRegistrationBean(context, "secondOne", "/myapp/*");
  }

В этом примере мы можем запускать http GET /foo и http GET /myapp/foo одновременно.

Примечания:

  1. WebFlux НЕ поддерживается.
  2. Пользовательский контекст приложения, если вам нужно.
0 голосов
/ 17 августа 2020

У вас есть так много вариантов для этого и для внешних серверов с помощью WebServerFactoryCustomizer

@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
  webServerFactoryCustomizer() {
    return factory -> factory.setContextPath("/context");
}

С помощью Spring Boot 1 мы можем создать экземпляр EmbeddedServletContainerCustomizer:

@Bean
public EmbeddedServletContainerCustomizer
  embeddedServletContainerCustomizer() {
    return container -> container.setContextPath("/yourContext");
}

Или с помощью java Системное свойство

public static void main(String[] args) {
    System.setProperty("server.servlet.context-path", "/yourContext");
    SpringApplication.run(Application.class, args);
}
...