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

标签 java spring spring-boot url-rewriting tomcat8

我正在尝试在 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,这是一个 fat jar,我目前没有。

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

最佳答案

嵌入了 Spring Boot 2 和 tomcat。

首先在资源目录下创建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 方法来实现如何检索配置文件以进行解析并将该阀门添加到上下文阀门中。

这对我来说很好:)

关于java - 如何将 Tomcat 重写阀添加到 Spring Boot 2.0 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54407192/

相关文章:

java - 带有 client_credentials 错误的 Oaut2RestTemplate(不允许匿名)

css - 无法使用 spring 提供静态资源,而是接收索引

Java 8 - CrudRepository<Developer,Long> 类型中的方法 save(S) 不适用于参数 (Optional<Developer>)

java - Spring Boot无法运行data.sql来初始化数据库

java - Spring命令设计模式的默认实现

java - 在 Android 中的两个 Activity 之间来回发送数据

java - 在 Spring security 2.0.2 登录后如何重定向到请求的 url

spring-boot - Spring Boot 数据 jpa 中的内连接

java - (作业)对话框窗口的问题以及关闭对话框时执行操作

java - 接口(interface)隔离原则适用于数据结构吗?