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

buy*_*ies 5 java spring url-rewriting tomcat8 spring-boot

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

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

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

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

    return factory;
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

嵌入了 Spring Boot 2 和 Tomcat。

首先在资源目录下创建rewrite.config文件,例如resources/rewrite.config。在我的服务器端运行路由反应的规则示例(反应需要将所有路由重定向到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]
Run Code Online (Sandbox Code Playgroud)

然后创建您自己的自定义类来配置 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);
    }
} 
Run Code Online (Sandbox Code Playgroud)

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

这对我来说效果很好:)