提问者:小点点

如何将Tomcat重写阀添加到Spring Boot 2.0应用程序


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

我将Spring Boot 2.0.3.RELEASE与Tomcat 8.5.31一起使用,并将应用程序打包为一个胖罐子。

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

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

    return factory;
}

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

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


共3个答案

匿名用户

嵌入了spring boot 2和tomcat。

首先在resources目录下创建< code>rewrite.config文件,如resources/rewrite.config。这个规则示例用于在我的服务器端运行路由react(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 方法,以实现如何检索配置文件以进行解析,并将该 valve 添加到上下文 valve 中。

这对我来说很好:)

匿名用户

问题是您正在配置Factory,因此创建和调用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;
    }
}

匿名用户

尝试将WEB-INF/rewrite.config放在src/main/resources/META-INF/resources/中。