【问题标题】:How can I use Angular2 PathLocationStrategy in a Spring Boot application?如何在 Spring Boot 应用程序中使用 Angular2 PathLocationStrategy?
【发布时间】:2016-08-14 03:33:25
【问题描述】:

在我们的应用程序中,我们希望将 angular2 前端部署到 Spring Boot 后端(到 src/main/resources/static 中),但去掉 url 中的 # 并使用 angular2 默认 PathLocationStrategy。

【问题讨论】:

    标签: spring-boot angular


    【解决方案1】:

    只是想分享我是如何做到的,希望它对某人有所帮助: (SpringBoot 1.3.3, Angular2.beta15, angular2-seed)

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
    import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
    import org.springframework.boot.context.embedded.ErrorPage;
    import org.springframework.boot.context.web.SpringBootServletInitializer;
    import org.springframework.context.annotation.Bean;
    import org.springframework.http.HttpStatus;
    
    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        @Bean
        public EmbeddedServletContainerCustomizer containerCustomizer(){
            return new Angular2PathLocationStrategyCustomizer();
        }
    
        private static class Angular2PathLocationStrategyCustomizer implements EmbeddedServletContainerCustomizer {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container){
                container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/"));
            }
        }
    }
    

    【讨论】:

    • jep,就像使用 dev express 服务器中间件一样:[require('connect-history-api-fallback')({index: 'index.html'})]
    • 我们为 Spring 应用定义了另一个基本 url,例如 localhost:8080/mybase 但这仍然有效
    【解决方案2】:

    这些是您需要遵循的三个步骤:

    1. 实现您自己的 TomcatEmbeddedServletContainerFactory bean 并设置 RewriteValve

        import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;  
        ...
        import org.apache.catalina.valves.rewrite.RewriteValve; 
        ... 
      
        @Bean TomcatEmbeddedServletContainerFactory servletContainerFactory() {
          TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
          factory.setPort(8080);
          factory.addContextValves(new RewriteValve());
          return factory;
        }
      
    2. 将rewrite.conf 文件添加到应用程序的WEB-INF 目录并指定重写规则。这是一个示例 rewrite.conf 内容,我在 Angular 应用程序中使用它来利用 Angular 的 PathLocationStrategy(基本上我只是将所有内容重定向到 index.html,因为我们只是使用 Spring Boot 来提供静态 Web 内容):

        RewriteCond %{REQUEST_URI} !^.*\.(bmp|css|gif|htc|html?|ico|jpe?g|js|pdf|png|swf|txt|xml|svg|eot|woff|woff2|ttf|map)$
        RewriteRule ^(.*)$ /index.html [L]
      
    3. 从你的路由声明中去掉 useHash(或将其设置为 false):

        RouterModule.forRoot(routes)
      

          RouterModule.forRoot(routes, {useHash: false})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-02
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多