当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:使用重写阀的嵌入式Tomcat

詹钊
2023-03-14

背景

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

我用的是Tomcat 8.5.x。

因为该阀希望配置在WEB-INF文件夹中可用,所以我设法重写了它的startInternal()方法,让它读取重写。类路径位置下的config文件,即containers/tomcat/rewrite.config。

阀门正确读取配置。rewrite.config文件仅说明以下规则:

^/app2.+ /app

也就是说,当请求url以/app2开头时,将url重写为/app。

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

什么不起作用

因为应用程序部署在/app下,所以当/app2请求被提交时,阀门从来没有真正被调用过。例如:

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

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

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

什么管用

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

  1. http://localhost:8080/app2 正确激活阀门。网址被重写为 http://localhost:8080/app

我可能做错了什么?

共有1个答案

郭鸿信
2023-03-14

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

^/app2.+ /app

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

^/app2.* /app
 类似资料:
  • 我有时会在pom中看到以下声明。xml。。。 如您所见,sping-boo-starter-web被声明为tomcat-embed-jasper。 是不是sping-boo-starter-web已经有一个嵌入式tomcat了?为什么一些开发人员仍然声明tomcat-embed-jasper以及boot-starter-web?还是有什么原因?

  • 我在我的SpringBoot应用程序中使用下面提到的属性,在文件中让LDAP代码在我的本地机器上运行。 我想同时拥有我的嵌入式配置

  • 在学习教程的同时,我正在使用SPRING初始化器https://start.spring.io/使用springboot 2.0.2生成带有reactiveMongoDB的项目。 gradle文件列出:compile('org.springframework.boot:spring-boot-starter-data-mongodb-reactive') 我能够将该项目导入eclipse,主类使用

  • 我用的是Springboot和junit,我想用Powermock来模拟静态类,添加了Powermock后,单元测试通过IntelliJ IDEA运行得很好,但是当我在terminal下运行时,它会抛出ApplicationContextException:无法启动web服务器\n无法启动嵌入式Tomcat 我的基本测试类: 测试类: 似乎无法启动springboot嵌入的tomcat,但要使用P

  • Ruby, like fire, is a very useful friend, and a very dangerous enemy. — Mikkel Bruun 在模板中使用嵌入式 Ruby 帮助构建动态的配置文件或实现数组遍历是一种强大的方式。 然而,你也可以在配置清单中使用 inline_template 函数直接嵌入 Ruby 而不必使用分离的模板文件。 操作步骤 在 Puppet

  • 我正在尝试在一个新的Spring Boot应用程序中使用WebFlux反应类型。我在https://start.spring.io上使用了initializr,并选择了2.0.0快照版本。我添加了web reactive dependency,我所做的一切工作都很好。这是一个非常可靠的POC,目标是如何利用这些类型来更新我们的API,为了做到这一点,我们计划缓慢地替换阻塞和/或同步进程的每个部分,