2016-08-22 72 views
1

背景春天启动的:使用RewriteValve

嵌入式的Tomcat我在一个简单的Java应用程序中使用Spring 1.4启动。作为一个实验,我决定编写自己的servletContainer()bean,将Tomcat的RewriteValve注入到容器中。此阀门作为全局上下文阀门添加,并应适用于所有请求。

我正在使用Tomcat 8.5.x.

因为Valve期望配置在WEB-INF文件夹中可用,所以我设法覆盖它的startInternal()方法,让它读取类路径位置下的rewrite.config文件,该位置是containers/tomcat/rewrite.config。

该阀门读取配置良好。该rewrite.config文件只是规定了以下规则:

^/app2.+ /app 

含义,重写URL为/应用程序时,请求URL与/ APP 2开始。

请注意,应用程序本身部署在/ app下,而不是ROOT下。这是通过server.context-path属性来处理的。

由于应用程序是在/应用程序部署什么行不通

,阀门从来没有真正/ APP 2请求被提交时调用。例如:

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

如果我删除了上下文路径和部署下根/应用程序,这是我可以观察到:

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

什么工作

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

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

我会做什么错?

+0

我认为,作为本地主机不输出的快照会更合适对其他机器可见 – emotionlessbananas

+0

使用嵌入式tomcat和部署到独立的tomcat是有区别的。嵌入式tomcat只监听上下文路径上的url(所以基本上整个服务器的根目录已被更改!)而独立的tomcat(没有修改)侦听'/'并根据url发送到正确的应用程序。因此,这里描述的结果基本上或多或少都如我所预期的那样。你自己的'servletContainer',它基本上是渲染默认的很没用,添加你的代码以获得更多帮助。 –

+0

你所描述的是有道理的。我的servletContainer中没有什么值得真正分享的。它所做的只是创建一个新的阀门实例,让我们读取配置文件并将其作为上下文阀门添加到工厂中。而已。 –

回答

0

您在用于描述重写规则

^/app2.+ /app 

的“。+”部分的正则表达式做出了错误意味着occurres一次或多次的任何字符,但需要至少app2字符串之后的一个字符。我认为你应该简单地将它改为“。*“,这意味着有可能是APP2之后的字符,但在同一时间,我们不希望它在那里:

^/app2.* /app