【问题标题】:How do I add Tomcat rewrite valve to Spring Boot 2.0 application如何将 Tomcat 重写阀添加到 Spring Boot 2.0 应用程序
【发布时间】:2019-06-21 18:18:07
【问题描述】:

我正在尝试在我的 Spring Boot 应用程序中使用 Tomcat 的重写阀,但是无法确定将 rewrite.conf 放在何处以便成功加载。

我将 Spring Boot 2.0.3.RELEASE 与 Tomcat 8.5.31 一起使用,并将应用程序打包为 fat jar。

我已经像这样配置了重写阀:

@Bean
public TomcatServletWebServerFactory containerFactory() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.addContextValves(new RewriteValve());

    return factory;
}

但是,它似乎依赖于 /WEB-INF 的目录结构来加载 rewrite.conf,这是一个胖 jar,我目前没有。

有没有人找到解决方案来配置它而不将应用程序打包结构更改为带有 WEB-INF 目录的 WAR?

【问题讨论】:

    标签: java spring spring-boot url-rewriting tomcat8


    【解决方案1】:

    嵌入了 spring boot 2 和 tomcat。

    首先在资源目录下创建rewrite.config 文件,如resources/rewrite.config。 在我的服务器端运行路由的这个规则示例(react 需要将所有路由重定向到 index.html)

    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]
    

    然后创建您自己的自定义类来配置tomcat服务器,如下所示:

    @Component
    public class CustomContainer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
    
        @Override
        public void customize(TomcatServletWebServerFactory factory) {
    
            final RewriteValve valve = new RewriteValve() {
    
                @Override
                protected synchronized void startInternal() throws LifecycleException {
                    super.startInternal();
    
                    try {
                        InputStream resource = new ClassPathResource("rewrite.config").getInputStream();
    
                        InputStreamReader resourceReader = new InputStreamReader(resource);
                        BufferedReader buffer = new BufferedReader(resourceReader);
    
                        parse(buffer);
    
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };
    
            valve.setEnabled(true);
    
            factory.addContextValves(valve);
        }
    } 
    

    这个自定义类重写了 starInternal 方法来实现如何检索配置文件以解析它并将该阀门添加到上下文阀门中。

    这对我来说很好:)

    【讨论】:

    • 我今天的救命稻草!非常感谢
    【解决方案2】:

    问题在于您正在配置工厂,因此创建和调用 setConfiguration() 将导致 NPE。 所以我用构造函数中的规则扩展了该类,一旦调用startInternal(),就会处理规则。

    希望这会有所帮助, 一月

    public class LazySpringRewriteValve extends RewriteValve {
    
        private String unProcessedRules = "";
    
        @Override
        protected synchronized void startInternal() throws LifecycleException {
            setState(LifecycleState.STARTING);
            context = (getContainer() instanceof Context);
            try {
                this.setConfiguration(unProcessedRules);
            } catch (Exception e) {
                throw new LifecycleException(e);
            }
        }
    
        public LazySpringRewriteValve(String unProcessedRules){
            super();
            this.unProcessedRules = unProcessedRules;
        }
    }
    

    【讨论】:

      【解决方案3】:

      尝试将WEB-INF/rewrite.config 放入src/main/resources/META-INF/resources/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-09
        • 1970-01-01
        • 2015-10-10
        • 2020-11-21
        • 2016-01-16
        • 2018-01-14
        • 2016-05-15
        • 1970-01-01
        相关资源
        最近更新 更多