2

背景

我在一个简单的 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。例如:

  1. http://localhost:8080/app2从不激活阀门
  2. http://localhost:8080/app/app2激活阀门

如果我删除上下文路径并在根目录下部署 /app,这就是我可以观察到的:

  1. http://localhost:8080/app2激活阀门

什么有效

使用外部 tomcat 容器,如果我手动配置具有相同规则的阀门,并将应用程序部署在 /app 下,我可以观察到:

  1. http://localhost:8080/app2正确激活了阀门。url 改写为http://localhost:8080/app

我可能做错了什么?

4

1 回答 1

0

您在用于描述重写规则的正则表达式中犯了一个错误

^/app2.+ /app

.+ ” 部分表示任何出现一次或多次的字符,但在 app2 字符串之后至少需要有一个字符。我认为您应该简单地将其更改为“ .* ”,这意味着在 app2 之后可能有一个字符,但同时我们不希望它在那里:

^/app2.* /app
于 2017-09-08T10:12:41.340 回答