我正在尝试在 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/