我试图在我的Spring Boot应用程序中使用Tomcat的重写阀,但无法确定将rewrite.conf放在何处才能成功加载。
我将Spring Boot 2.0.3.RELEASE与Tomcat 8.5.31一起使用,并将应用程序打包为一个胖罐子。
我已经像这样配置了重写阀:
@Bean
public TomcatServletWebServerFactory containerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addContextValves(new RewriteValve());
return factory;
}
然而,它似乎依赖于/WEB-INF目录结构来从中加载rewrite.conf,这是一个我目前没有的胖jar。
有没有人找到一个解决方案来配置它,而不将应用程序打包结构更改为带有WEB-INF目录的WAR?
嵌入了spring boot 2和tomcat。
首先在resources目录下创建< code>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 方法,以实现如何检索配置文件以进行解析,并将该 valve 添加到上下文 valve 中。
这对我来说很好:)
问题是您正在配置Factory,因此创建和调用setConfiguration()
将导致NPE。所以我用构造函数中的规则扩展了这个类,一旦调用startInternal()
,规则就会被处理。
希望这有所帮助,简
public class LazySpringRewriteValve extends RewriteValve {
private String unProcessedRules = "";
@Override
protected synchronized void startInternal() throws LifecycleException {
setState(LifecycleState.STARTING);
context = (getContainer() instanceof Context);
try {
this.setConfiguration(unProcessedRules);
} catch (Exception e) {
throw new LifecycleException(e);
}
}
public LazySpringRewriteValve(String unProcessedRules){
super();
this.unProcessedRules = unProcessedRules;
}
}
尝试将WEB-INF/rewrite.config
放在src/main/resources/META-INF/resources/
中。