java - 在 spring-boot 中配置嵌入式 apache tomcat 内的“tomcat-server.xml”文件
问题描述
我正在使用带有嵌入式tomcat(版本9.0.16)的spring boot(2.1.3.RELEASE)开发一个java应用程序(jar文件)。
我想覆盖tomcat的Catalina ErrorReportValve错误页面,
为此,我需要让 Tomcat 使用我为此目的创建的自定义类,而不是默认类。这可以通过更新 Tomcat 的配置文件“server.xml”中的 Host 元素来完成。
自定义类:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.logging.Logger;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ErrorReportValve;
public class CustomErrorReportValve extends ErrorReportValve {
// Create a simple logger
Logger log = Logger.getLogger(CustomErrorReportValve.class.getName());
@Override
protected void report(Request request, Response response, Throwable t) {
try {
// Write a more friendly, less technical message to the user
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()));
out.write("<html><head><title>Oops</title><body>");
out.write("<h1>Oops</h1>");
out.write("<p>Well, that didn't go as we had expected.</p>");
out.write("<p>Don't worry though, we're working on it.</p>");
out.write("</body></html>");
out.close();
// Log the error with your favorite logging framework...
log.severe("Uncaught throwable was thrown: " + t.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
}
server.xml(或使用嵌入式 tomcat 时的 tomcat-server.xml):
<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />
我在spring 文档中发现,在 spring中使用嵌入式 tomcat 时,配置文件称为 tomcat-server.xml 而不是 server.xml。
现在,问题是我在spring boot项目中找不到tomcat-server.xml,或者如何配置/覆盖它,如果没有,有没有其他方法可以在springboot中自定义catalina ErrorReportValve错误页面嵌入雄猫?
谢谢您的帮助!!
解决方案
您的问题似乎与以下问题有关:
import org.apache.catalina.Container;
import org.apache.catalina.core.StandardHost;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
// https://docs.spring.io/spring-boot/docs/2.4.4/reference/htmlsingle/#howto-use-tomcat-legacycookieprocessor
// https://github.com/spring-projects/spring-boot/issues/21257#issuecomment-745565376
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> errorReportValveCustomizer() {
return (factory) -> {
factory.addContextCustomizers(context -> {
final Container parent = context.getParent();
if (parent instanceof StandardHost) {
((StandardHost) parent).setErrorReportValveClass(
"your.package.CustomErrorReportValve");
}
});
};
}
}
推荐阅读
- c# - 如何从项目列表中验证日期开始和完成重叠
- xcode - 升级到 Xcode 11 后,应用程序不显示某些 UILabel
- python - OR 运算符 (|) 在正则表达式中如何工作?
- django - 批量更新不适用于文件字段上传 django
- r - 使用“rticles”包时如何更改 RMarkdown 中的字体?
- active-directory - GSuite 同步到 Active Directory
- linux - 在 shell 脚本中查找匹配的 `)' 时出现意外的 EOF
- c# - 使用 ASP.NET Core 和 NUnit 实施集成测试
- applescript - 如何确定应用程序退出事件
- session - 在获取访问令牌以代表用户执行 API 请求后,保持用户会话和令牌连接的“正确”方式是什么?