【问题标题】:Spring Boot: Embedded Tomcat using RewriteValveSpring Boot:使用 RewriteValve 的嵌入式 Tomcat
【发布时间】:2016-12-28 14:43:54
【问题描述】:

背景

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

我使用的是 Tomcat 8.5.x。

因为 Valve 期望配置在 WEB-INF 文件夹中可用,所以我设法覆盖它的 startInternal() 方法,让它读取容器/tomcat/rewrite 的类路径位置下的 rewrite.config 文件.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容器,如果我手动配置valve的规则一样,并将app部署在/app下,可以观察到:

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

我可能做错了什么?

【问题讨论】:

  • 我认为输出快照会更合适,因为您的本地主机对其他机器不可见
  • 使用嵌入式 tomcat 和部署到独立 tomcat 有天壤之别。嵌入式 tomcat only 侦听上下文路径上的 url(因此基本上整个服务器的根都已更改!)而独立的 tomcat(未修改)侦听 / 并调度到基于 url 的正确应用程序。因此,您在此处描述的结果基本上或多或少如我所料。您说您还编写了自己的servletContainer,它基本上使默认的非常无用,添加您的代码以获得更多帮助。
  • 你描述的有道理。我的 servletContainer 中没有什么值得真正分享的。它所做的只是创建一个新的阀门实例,读取配置文件并将其添加到工厂作为上下文阀门。仅此而已。
  • 您说您已将其添加为上下文阀,但我认为需要在主机(或引擎)上对其进行配置才能按您的预期工作。
  • 也试过了。真的没有区别

标签: java spring-boot tomcat8 embedded-container


【解决方案1】:

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

^/app2.+ /app

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

^/app2.* /app

【讨论】:

  • 改变模式也没有区别。
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 2015-03-23
  • 2018-05-28
  • 2017-09-14
  • 2017-03-12
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多