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

Java 如何将Tomcat重写阀添加到Spring Boot 2.0应用程序,java,spring,spring-boot,url-rewriting,tomcat8,Java,Spring,Spring Boot,Url Rewriting,Tomcat8,我试图在我的Spring Boot应用程序中使用Tomcat的重写阀,但是无法确定将rewrite.conf放在哪里才能成功加载 我将SpringBoot2.0.3.RELEASE与Tomcat8.5.31一起使用,并将应用程序打包为一个胖罐子 我已将重写阀配置为: @Bean public TomcatServletWebServerFactory containerFactory() { TomcatServletWebServerFactory factory = new Tomc

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

我将SpringBoot2.0.3.RELEASE与Tomcat8.5.31一起使用,并将应用程序打包为一个胖罐子

我已将重写阀配置为:

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

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


是否有人找到了一种解决方案,可以在不将应用程序打包结构更改为WEB-INF目录下的WAR的情况下对此进行配置?

尝试将
WEB-INF/rewrite.config
放在
src/main/resources/META-INF/resources/
中。问题是您正在配置工厂,因此,创建和调用
setConfiguration()
将导致NPE。 所以我用构造函数中的规则扩展了这个类,一旦调用了
startInternal()
,规则就被处理了

希望这有帮助, 一月


带spring boot 2和嵌入式tomcat

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

然后创建自己的自定义类来配置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);
    }
} 
@组件
公共类CustomContainer实现WebServerFactoryCustomizer{
@凌驾
公共void自定义(TomcatServletWebServerFactory){
最终重写阀=新重写阀(){
@凌驾
受保护的同步void startInternal()引发LifecycleException{
super.startInternal();
试一试{
InputStream资源=新类路径资源(“rewrite.config”).getInputStream();
InputStreamReader resourceReader=新的InputStreamReader(资源);
BufferedReader buffer=新的BufferedReader(resourceReader);
解析(缓冲);
}捕获(IOE异常){
e、 printStackTrace();
}
}
};
阀门。设置启用(真);
工厂。addContextValves(阀门);
}
} 
该自定义类重写starInternal方法,以实现如何检索配置文件进行解析,并在上下文valves中添加该valve


这项工作对我来说很好:)

我今天的救命恩人!谢谢
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]
@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);
    }
}