背景
我在一个简单的 Java 应用程序中使用 Spring Boot 1.4。作为一个实验,我决定编写自己的 servletContainer() bean 来将 Tomcat 的RewriteValve注入到容器中。这个阀门被添加为全局上下文阀门,并且应该适用于所有请求。
我正在使用 Tomcat 8.5.x。
因为 Valve 期望配置在 WEB-INF 文件夹中可用,所以我设法覆盖它的 startInternal() 方法,让它读取位于容器/tomcat/rewrite.config 的类路径位置下的 rewrite.config 文件。
阀门可以很好地读取配置。rewrite.config 文件简单地陈述了以下规则:
^/app2.+ /app
意思是,当请求 url 以 /app2 开头时,将 url 重写为 /app。
需要注意的是,应用程序本身部署在 /app 下,而不是 ROOT 下。这是通过 server.context-path 属性处理的。
什么不起作用
由于应用程序部署在 /app 下,因此在提交 /app2 请求时永远不会真正调用 Valve。例如:
如果我删除上下文路径并在根目录下部署 /app,这就是我可以观察到的:
什么有效
使用外部 tomcat 容器,如果我手动配置具有相同规则的阀门,并将应用程序部署在 /app 下,我可以观察到:
- http://localhost:8080/app2正确激活了阀门。url 改写为http://localhost:8080/app
我可能做错了什么?