Java 如何将Tomcat重写阀添加到Spring Boot 2.0应用程序
我试图在我的Spring Boot应用程序中使用Tomcat的重写阀,但是无法确定将rewrite.conf放在哪里才能成功加载 我将SpringBoot2.0.3.RELEASE与Tomcat8.5.31一起使用,并将应用程序打包为一个胖罐子 我已将重写阀配置为: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
@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);
}
}