如何将 Tomcat 重写阀添加到 Spring Boot 2.0 应用程序

2024-03-14

我正在尝试在 Spring Boot 应用程序中使用 Tomcat 重写阀,但是无法确定将 rewrite.conf 放在哪里才能成功加载。

我将 Spring Boot 2.0.3.RELEASE 与 Tomcat 8.5.31 一起使用,并将应用程序打包为 fat jar。

我已经像这样配置了重写阀:

@Bean
public TomcatServletWebServerFactory containerFactory() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.addContextValves(new RewriteValve());

    return factory;
}

但是,它似乎依赖于 /WEB-INF 的目录结构来加载 rewrite.conf,这是一个 fat jar,我目前没有。

有没有人找到一种解决方案来配置它,而不将应用程序打包结构更改为带有 WEB-INF 目录的 WAR?


嵌入了 Spring Boot 2 和 Tomcat。

首先创建rewrite.configresources目录下的文件是这样的资源/rewrite.config。 在我的服务器端运行路由反应的规则示例(反应需要将所有路由重定向到index.html)

RewriteCond %{REQUEST_URI} !^.*\.(bmp|css|gif|htc|html?|ico|jpe?g|js|pdf|png|swf|txt|xml|svg|eot|woff|woff2|ttf|map)$
RewriteRule ^(.*)$ /index.html [L]

然后创建您自己的自定义类来配置 tomcat 服务器,如下所示:

@Component
public class CustomContainer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    @Override
    public void customize(TomcatServletWebServerFactory factory) {

        final RewriteValve valve = new RewriteValve() {

            @Override
            protected synchronized void startInternal() throws LifecycleException {
                super.startInternal();

                try {
                    InputStream resource = new ClassPathResource("rewrite.config").getInputStream();

                    InputStreamReader resourceReader = new InputStreamReader(resource);
                    BufferedReader buffer = new BufferedReader(resourceReader);

                    parse(buffer);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };

        valve.setEnabled(true);

        factory.addContextValves(valve);
    }
} 

此自定义类重写 starInternal 方法来实现如何检索配置文件以进行解析并将该阀门添加到上下文阀门中。

这对我来说效果很好:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Tomcat 重写阀添加到 Spring Boot 2.0 应用程序 的相关文章

  • Jackson Json 将对象反序列化为列表

    我正在使用 Spring 的 Web 服务RestTemplate并反序列化Jackson 在来自服务器的 JSON 响应中 其中一个字段可以是对象或列表 这意味着它可以是 result or result 有没有办法通过对我要反序列化的类
  • 包含小时、分钟和秒的周期[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个代表年 月 周 日 小时 分钟 秒的间隔数据类型 前三年 年 月 日 可以用Period最后
  • 无法解析配置“:app:debugRuntimeClasspath”的所有文件。问题

    我的 android studio 遇到了下一个问题 导致 org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveEx
  • 黄瓜与 Micronaut

    我正在尝试将 Cucumber 与 Micronaut 一起使用 但当我尝试将其与 Cucumber 一起使用时 MicronautTest 注释根本不起作用 未注入 theApple 请参阅下面的代码 如果我在没有黄瓜的情况下运行它就可以
  • GSON:自定义对象反序列化

    好吧 我编辑了这个问题 因为它不够清楚 Edit 2 更新了 JSON 文件 我在 Android 应用程序中使用 GSON 我需要解析来自服务器的 JSON 文件 而且有点太复杂了 我不想让我的对象结构太重 所以我想简化内容 所以我的对象
  • 从继承的受保护 Java 字段创建公共访问器

    我怎样才能完成以下工作 class Foo extends javax swing undo UndoManager increase visibility works for method override def editToBeUnd
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • 将二进制数据的 byte[] 转换为 String

    我有二进制格式的数据 hex 80 3b c8 87 0a 89 我需要将其转换为字符串 以便通过 Jackcess 将二进制数据保存在 MS Access 数据库中 我知道 我不打算在 Java 中使用 String 来存储二进制数据 但
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • ApplicationEventMulticaster 未初始化 - 在多播事件之前调用“刷新”

    我正在尝试实施ehcache对于我的应用程序 但是当尝试调用服务器时 出现以下错误 java lang IllegalStateException ApplicationEventMulticaster not initialized ca
  • 比较和删除列表和数组java中不存在的元素

    我有一个String数组和一List
  • 如何使用 UUID 生成唯一的正 Long

    我需要为我的数据库主键列生成唯一的长 ID 我以为我可以用UUID randomUUID getMostSignificantBits 但有时它也会产生一些负多头 这对我来说是个问题 是否可以从 UUID 中仅生成正长 将会有数十亿个条目
  • 使用antlr4获取预处理器行并解析C代码

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • 如何减少 JSF 中的 javax.faces.ViewState

    减少 JSF 中视图状态隐藏字段大小的最佳方法是什么 我注意到我的视图状态约为 40k 这会在每次请求和响应时下降到客户端并返回到服务器 特别是到达服务器时 这对用户来说会显着减慢 我的环境 JSF 1 2 MyFaces Tomcat T
  • 如何获取队列中的第 n 个项目?

    我的应用程序中有许多队列和优先级队列 我想轻松访问这些队列中的第 n 个项目 但没有看到使用 API 实现此目的的简单方法 我想我可以创建一个Iterator并迭代到第 n 个元素或使用toArray index 但似乎应该有一个更简单的方
  • 如何使用 Spring Resource.groovy 正确注入 Grails 服务

    使用 Grails 2 2 1 我定义了以下 Grails 服务 package poc class TestService def helperService class HelperService 我已经用过TestService如下
  • 如何在SpringBootTest中向Autowired testRestTemplate添加基本身份验证;春季启动 1.4

    我在 Spring Boot 1 4 之前的 OAuth 集成测试如下 更新只是为了不使用已弃用的功能 RunWith SpringRunner class SpringBootTest classes ApplicationConfigu
  • javafx中的stackpane和root有什么区别?

    我正在练习javafx做饼图 以下是开发饼图的代码 如果我这样做Group并与StackPane 我发现输出没有区别 我已经评论了组部分 只是徘徊两者之间的区别 import javafx application Application i

随机推荐

  • 使用 dplyr 的过滤器和 mutate 生成新变量

    我选择 hflights dataset 作为示例 我尝试创建一个包含飞机 TailNum 的变量 列 但仅限于飞行时间最长的 10 以下的飞机 install packages hflights library hflights flig
  • Git GUI 崩溃信号 6

    我正在使用 git 版本 1 9 2 和 Xcode6 Beta3 一开始 git gui 工作正常 由于某种原因 我不知道 在终端上输入 git gui 时 我收到以下崩溃消息 由于未捕获的异常 NSInternalInconsisten
  • 获取由 Worksheet.Copy 复制的最后一个工作表的句柄

    我正在尝试获取通过复制操作创建的工作表的句柄 以下代码曾经有效 Dim wsTempl As Worksheet pageCount as Long Set wsTempl Sheets Template For pageCount 1 T
  • Java中子线程会继承父线程的ThreadScope吗?

    在Java中 我有一个Thread A If A产生一个子线程 b does b可以访问任何 所有ThreadLocal由设置的变量A 如果你的意思是InheritableThreadLocal 扩展ThreadLocal 那么是的 每个子
  • 刷新后保持 WebSocket 连接处于活动状态

    我有一个实时应用程序 它在 java spring 服务器和浏览器之间使用 WebSockets 有没有办法在页面刷新后保持 Websocket 连接处于活动状态 这是我的 JavaScript 代码 consumerWebSocket n
  • 如何使用 $arrayElemAt 并从 MongoDB $projection 中的该元素中删除字段?

    我有 工作 和 用户 集合 每个用户都可以为给定的 jobCategoryId 创建一个作业 然后该作业将保存在 jobs 集合中 并包含其创建者的 userId 和 jobCategoryId 我正在尝试合并这两个集合 因此当我获取作业时
  • 当用户在 Android 中更改为静默模式时执行代码

    我正在使用一项服务 在该服务中 当用户更改为静默模式时 我的代码应该被执行 即一旦用户更改为静默模式 我的代码就需要被执行 我怎样才能做到这一点 您不想使用服务 相反 你想使用广播接收器 http developer android com
  • 使用innerHTML在某个div中显示JSON/对象数据

    我创建了以下 JS 代码 加载 HTML 文档时 脚本会正确显示三个位置数据集
  • 启动带有嵌入式 Tomcat 的 Spring Boot 应用程序时如何配置堆大小?

    我正在尝试部署一个春季启动 https projects spring io spring boot 为生产提供支持的 Web 应用程序 该应用程序是使用 Spring Boot 1 0 1 构建的 并嵌入了默认的 Tomcat 7 作为应
  • 如何在调试模式下编译? (netbeans、java、maven)

    我在项目中面临注释 持久性错误 并且持久性库抛出 NullPointerException when trying to resolve the entities org eclipse persistence internal jpa m
  • Galaxy Tab 出现奇怪的性能问题

    我正在编写 2d 教程 并且能够在 Samsung Galaxy Tab 上测试我当前的教程部分 本教程只是在屏幕上随机移动默认图标 通过点击 我创建了一个新的移动图标 只要屏幕上有 25 个或更少的元素 Galaxy 上的一切都可以正常运
  • Linux 上 Objective-C 的 IDE [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在学习 Objective C 我想知道在哪里可以找到 Linux 上 Objective C 的
  • 加载逗号后空格不一致的 CSV 文件

    我想使用加载 CSV 文件LOAD DATA INFILE命令 但逗号后面的空格不一致 即有些逗号后面跟着空格 有些逗号后面没有空格 我尝试使用FIELDS TERMINATED BY 指令 但结果表中的某些字段包含前导空格 如果输入是 a
  • 如何将我自己的存储库分叉到新项目中?

    我正在开发一个 HTML5 游戏引擎 我使用 Git 作为 SV 并使用 GitHub 来实际托管该项目 我在设计上做了一些实质性的改变 主要是切换到实体系统范例 我认为是时候换一个新引擎了 我想将它建立在旧引擎的基础上 因为我可以使用很多
  • Javascript:添加动态方法的更好方法?

    我想知道是否有更好的方法向现有对象添加动态方法 基本上 我试图动态地组装新方法 然后将它们附加到现有函数中 该演示代码有效 builder function fn methods method builder for p in method
  • 加载 JSON 文件时出现内存错误

    当我加载 500Mo 大的 JSON 文件时 Python 和间谍程序 返回 MemoryError 但我的电脑有 32Go RAM 当我尝试加载它时 spyder 显示的 内存 从 15 变为 19 看来我应该有更多的空间 有什么我没想到
  • 将网络抓取的响应保存为 csv 文件

    我从网站下载了一个文件rvest 如何将回复另存为csv file Step 1 猴子补丁rvest像这个线程中的包 如何在 Rvest 包中提交登录表单 不带按钮参数 https stackoverflow com questions 3
  • 如何在silverlight3.0中播放Youtube视频

    我正在开发一个 silverlight 应用程序 我想在其中播放 youtube 视频 任何建议请 可供参考的任何示例或任何链接 提前致谢 这里有一个关于这个问题的有趣主题 其中包含 SL 3 0 beta 中的一些示例 http silv
  • 在简单的 main() 中获取rawinputdata

    我正在尝试使用简单的 C 技术和 Windows 从操纵杆读取值 我的目标是编写一个程序 每当操纵杆信号超过预定义阈值时 该程序就会发送键盘命令 键盘命令将由当时处于活动状态的窗口拾取 我的 C 编码技能有限 因此我希望以最简单的方式完成此
  • 如何将 Tomcat 重写阀添加到 Spring Boot 2.0 应用程序

    我正在尝试在 Spring Boot 应用程序中使用 Tomcat 重写阀 但是无法确定将 rewrite conf 放在哪里才能成功加载 我将 Spring Boot 2 0 3 RELEASE 与 Tomcat 8 5 31 一起使用