Spring Boot:使用RewriteValve

时间:2016-08-22 06:48:34

标签: java spring-boot tomcat8 embedded-container

背景

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

我正在使用Tomcat 8.5.x。

因为阀门要求配置在WEB-INF文件夹中可用,所以我设法覆盖它的startInternal()方法,让它读取一个类路径位置下的rewrite.config文件,即container / tomcat / rewrite的.config。

阀门读取配置正常。 rewrite.config文件只是声明了以下规则:

^/app2.+ /app

意思是,当请求网址以/ app2开头时,将网址重写为/ app。

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

什么行不通

由于应用程序部署在/ app下,因此在提交/ app2请求时永远不会真正调用阀门。例如:

  1. http://localhost:8080/app2永远不会激活阀门
  2. http://localhost:8080/app/app2激活阀门
  3. 如果我删除root下的context-path和deploy / app,我就可以观察到:

    1. http://localhost:8080/app2激活阀门
    2. 什么有用

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

      1. http://localhost:8080/app2正确启动阀门。该网址被重写为http://localhost:8080/app
      2. 我可能做错了什么?

1 个答案:

答案 0 :(得分:0)

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

^/app2.+ /app

" 。+ " part表示出现一次或多次的任何字符,但app2字符串后面至少需要有一个字符。我认为您应该将其更改为" 。* "这意味着app2之后可能会有一个角色,但与此同时我们并不期望它会在那里:

^/app2.* /app