Spring Boot 内嵌 Tomcat 原理:Tomcat ServletWebServerFactory 源码解析
版本说明:Spring Boot 3.2.x + Tomcat 10.1.x | JDK 17+
摘要
Spring Boot 通过"约定优于配置"的理念,极大地简化了 Web 应用的开发。其中最显著的特征之一就是将 Web 容器(如 Tomcat)内嵌到应用中,实现了"java -jar"直接启动的零部署模式。本文将从源码层面深度剖析 Spring Boot 3.x 如何通过 TomcatServletWebServerFactory 实现内嵌 Tomcat 的自动化配置与启动流程,揭示其背后的设计思想与技术细节。
目录
- 背景:为什么需要内嵌容器
- 核心架构设计
- [ServletWebServerFactory 接口体系](#ServletWebServerFactory 接口体系)
- [TomcatServletWebServerFactory 源码解析](#TomcatServletWebServerFactory 源码解析)
- [内嵌 Tomcat 启动流程](#内嵌 Tomcat 启动流程)
- 自定义配置与扩展
- 实战案例:构建生产级配置
- 总结与最佳实践
1. 背景:为什么需要内嵌容器
1.1 传统部署模式 vs 内嵌容器模式
传统部署模式的问题:
graph LR
A[开发人员] --> B[编写代码]
B --> C[构建 WAR 包]
C --> D[安装 Tomcat]
D --> E[配置 server.xml]
E --> F[部署 WAR 包]
F --> G[启动 Tomcat]
G --> H[应用运行]
style D fill:#ff9999
style E fill:#ff9999
传统模式下,运维人员需要: - 独立安装和配置 Tomcat 服务器 - 手动管理多个版本的环境兼容性 - 处理容器与应用的版本依赖冲突 - 复杂的部署和回滚流程
Spring Boot 内嵌容器的优势:
graph LR
A[开发人员] --> B[编写代码]
B --> C[构建 Fat JAR]
C --> D[java -jar 启动]
D --> E[应用运行]
style C fill:#99ff99
style D fill:#99ff99
1.2 技术演进对比
| 特性 | 传统外置容器 | Spring Boot 内嵌容器 |
|---|---|---|
| 部署方式 | WAR 包部署到独立容器 | Fat JAR 包含容器 |
| 启动速度 | 慢(需启动容器+应用) | 快(容器即应用) |
| 版本管理 | 容器版本与应用版本分离 | 版本绑定,避免冲突 |
| 配置复杂度 | 需配置 server.xml、web.xml | 自动配置,application.yml |
| 资源占用 | 多应用共享容器 | 每应用独立容器 |
| 隔离性 | 应用间可能互相影响 | 完全隔离 |
| 云原生支持 | 需额外适配 | 天然支持容器化 |
2. 核心架构设计
2.1 整体架构
Spring Boot 的内嵌容器设计采用了工厂模式 + 策略模式的组合:
graph TB
A[ServletWebServerFactory] --> B[TomcatServletWebServerFactory]
A --> C[JettyServletWebServerFactory]
A --> D[UndertowServletWebServerFactory]
B --> E[TomcatWebServer]
C --> F[JettyWebServer]
D --> G[UndertowWebServer]
H[WebServerFactoryCustomizer] --> B
H --> C
H --> D
I[ConfigurableServletWebServerFactory] --> B
style A fill:#e1f5ff
style B fill:#ffe1e1
style C fill:#e1ffe1
style D fill:#ffffe1
核心接口与类关系:
java
#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}// 最顶层抽象工厂接口`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}public interface ServletWebServerFactory {`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} WebServer getWebServer(ServletContextInitializer... initializers);`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}}`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}// 可配置的工厂接口(继承自上)`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}public interface ConfigurableServletWebServerFactory `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} extends ServletWebServerFactory, WebServerFactoryCustomizer {`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} void setPort(int port);`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} void setAddress(InetAddress address);`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} void setContextPath(String contextPath);`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} // ... 更多配置方法`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}}`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}// Tomcat 具体实现`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}public class TomcatServletWebServerFactory `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} extends AbstractServletWebServerFactory `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} implements ConfigurableServletWebServerFactory {`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} @Override`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} public WebServer getWebServer(ServletContextInitializer... initializers) {`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} // 创建并配置 Tomcat`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} // ...`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
} }`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
WebServer getWebServer(ServletContextInitializer... initializers);
}
// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory
extends ServletWebServerFactory, WebServerFactoryCustomizer {
void setPort(int port);
void setAddress(InetAddress address);
void setContextPath(String contextPath);
// ... 更多配置方法
}
// Tomcat 具体实现
public class TomcatServletWebServerFactory
extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// 创建并配置 Tomcat
// ...
}
}}
2.2 自动配置机制
Spring Boot 通过 ServletWebServerFactoryAutoConfiguration 自动配置类实现容器的自动装配:
java
#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}// Spring Boot 3.x 源码位置`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}@AutoConfiguration`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}@ConditionalOnWebApplication(type = Type.SERVLET)`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}@EnableConfigurationProperties(ServerProperties.class)`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
} ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
} ServletWebServerFactoryConfiguration.EmbeddedJetty.class,`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
} ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}public class ServletWebServerFactoryAutoConfiguration {`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
} // 自动配置核心逻辑`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
} // 根据 classpath 中的容器类自动选择实现`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
// 自动配置核心逻辑
// 根据 classpath 中的容器类自动选择实现
}}
自动配置决策流程:
flowchart TD
A[启动应用] --> B{classpath 存在<br/>Tomcat.class?}
B -->|是| C[创建 TomcatServletWebServerFactory]
B -->|否| D{classpath 存在<br/>Jetty.class?}
D -->|是| E[创建 JettyServletWebServerFactory]
D -->|否| F{classpath 存在<br/>Undertow.class?}
F -->|是| G[创建 UndertowServletWebServerFactory]
F -->|否| H[抛出异常:<br/>缺少 Web 容器]
C --> I[注册为 Spring Bean]
E --> I
G --> I
I --> J[完成自动配置]
style C fill:#ffe1e1
style E fill:#e1ffe1
style G fill:#ffffe1
style H fill:#ff9999
3. ServletWebServerFactory 接口体系
3.1 接口继承关系
classDiagram
class ServletWebServerFactory {
<<interface>>
+getWebServer(ServletContextInitializer...) WebServer
}
class ConfigurableServletWebServerFactory {
<<interface>>
+setPort(int port) void
+setAddress(InetAddress address) void
+setContextPath(String contextPath) void
}
class AbstractServletWebServerFactory {
<<abstract>>
#port int
#address InetAddress
#contextPath String
#getSession() Session
}
class TomcatServletWebServerFactory {
+getWebServer(ServletContextInitializer...) WebServer
+setTomcatConnectorCustomizers(List) void
}
ServletWebServerFactory <|.. ConfigurableServletWebServerFactory
ConfigurableServletWebServerFactory <|.. AbstractServletWebServerFactory
AbstractServletWebServerFactory <|-- TomcatServletWebServerFactory
ServletWebServerFactory <|.. TomcatServletWebServerFactory
3.2 核心方法签名
java
#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}/**`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} * ServletWebServerFactory 接口定义`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} * Spring Boot 3.2.x`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} */`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}@FunctionalInterface`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}public interface ServletWebServerFactory {`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} /**`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} * 获取 WebServer 实例`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} * @param initializers Servlet 上下文初始化器`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} * @return 配置好的 WebServer`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} */`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} WebServer getWebServer(ServletContextInitializer... initializers);`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}}`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}/**`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} * WebServer 接口 - 所有内嵌容器的统一抽象`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} */`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}public interface WebServer {`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} /**`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} * 启动 Web 服务器`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} */`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} void start() throws WebServerException;`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} /**`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} * 停止 Web 服务器`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} */`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} void stop() throws WebServerException;`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} /**`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} * 获取监听端口`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} */`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
} int getPort();`
`#/**
* ServletWebServerFactory 接口定义
* Spring Boot 3.2.x
*/
@FunctionalInterface
public interface ServletWebServerFactory {
/**
* 获取 WebServer 实例
* @param initializers Servlet 上下文初始化器
* @return 配置好的 WebServer
*/
WebServer getWebServer(ServletContextInitializer... initializers);
}
/**
* WebServer 接口 - 所有内嵌容器的统一抽象
*/
public interface WebServer {
/**
* 启动 Web 服务器
*/
void start() throws WebServerException;
/**
* 停止 Web 服务器
*/
void stop() throws WebServerException;
/**
* 获取监听端口
*/
int getPort();
}}
不同容器的实现对比:
| 容器类型 | Factory 实现 | WebServer 实现 | 核心特性 |
|---|---|---|---|
| Tomcat | TomcatServletWebServerFactory | TomcatWebServer | 成熟稳定,企业级首选 |
| Jetty | JettyServletWebServerFactory | JettyWebServer | 轻量级,长连接友好 |
| Undertow | UndertowServletWebServerFactory | UndertowWebServer | 高性能,低内存占用 |
4. TomcatServletWebServerFactory 源码解析
4.1 类结构与核心属性
java
#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}/**`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * Tomcat ServletWebServerFactory 的完整实现`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * Spring Boot 3.2.x`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} */`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} implements ConfigurableServletWebServerFactory, ResourceLoaderAware {`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} // ========== Tomcat 特定配置 ==========`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} `
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} /**`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * Tomcat 基础目录 - 用于存放临时文件`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * 默认值:系统临时目录`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} */`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private File baseDirectory;`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} /**`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * 连接器定制器列表 - 允许自定义 Connector 配置`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} */`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} /**`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * 上下文定制器列表 - 允许自定义 Context 配置`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} */`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} /**`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * 协议升级列表(如 HTTP/2)`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} */`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} /**`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * URI 编码 - 默认 UTF-8`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} */`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private Charset uriEncoding = StandardCharsets.UTF_8;`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} /**`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} * 后台处理器延迟 - 用于优雅关闭`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} */`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private int backgroundProcessorDelay;`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} `
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} // 其他配置...`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private boolean disableMBeanRegistry = false;`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private List<Valve> engineValves = new ArrayList<>();`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private List<Valve> contextValves = new ArrayList<>();`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} `
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} // ResourceLoader 资源加载器(用于静态资源)`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
} private ResourceLoader resourceLoader;`
`#/**
* Tomcat ServletWebServerFactory 的完整实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
* Spring Boot 3.2.x
*/
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
implements ConfigurableServletWebServerFactory, ResourceLoaderAware {
private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);
// ========== Tomcat 特定配置 ==========
/**
* Tomcat 基础目录 - 用于存放临时文件
* 默认值:系统临时目录
*/
private File baseDirectory;
/**
* 连接器定制器列表 - 允许自定义 Connector 配置
*/
private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();
/**
* 上下文定制器列表 - 允许自定义 Context 配置
*/
private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();
/**
* 协议升级列表(如 HTTP/2)
*/
private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();
/**
* URI 编码 - 默认 UTF-8
*/
private Charset uriEncoding = StandardCharsets.UTF_8;
/**
* 后台处理器延迟 - 用于优雅关闭
*/
private int backgroundProcessorDelay;
// 其他配置...
private boolean disableMBeanRegistry = false;
private List<Valve> engineValves = new ArrayList<>();
private List<Valve> contextValves = new ArrayList<>();
// ResourceLoader 资源加载器(用于静态资源)
private ResourceLoader resourceLoader;
}}
4.2 核心方法:getWebServer()
这是整个工厂模式的核心方法,负责创建和配置 Tomcat 实例:
java
#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
}/**`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} * 创建并配置 Tomcat WebServer`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} * 源码版本:Spring Boot 3.2.x`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} * `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} * @param initializers Servlet 上下文初始化器数组`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} * @return 配置完成的 TomcatWebServer 实例`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} */`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
}@Override`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
}public WebServer getWebServer(ServletContextInitializer... initializers) {`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // ========== 步骤 1: 创建 Tomcat 实例 ==========`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} Tomcat tomcat = new Tomcat();`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // ========== 步骤 2: 配置基础目录 ==========`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} File baseDir = (this.baseDirectory != null) ? this.baseDirectory `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} : createTempDir("tomcat"); // 默认创建临时目录`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} tomcat.setBaseDir(baseDir.getAbsolutePath());`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // ========== 步骤 3: 创建 Connector 连接器 ==========`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // Connector 负责处理 HTTP 请求`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} connector.setThrowOnFailure(true);`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // 应用端口和地址配置`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} if (getAddress() != null) {`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} connector.setAddress(getAddress());`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} }`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // ========== 步骤 4: 配置 Engine(引擎)==========`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // Engine 是 Tomcat 的顶级容器,处理所有请求`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} tomcat.getService().addConnector(connector);`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} customizeConnector(connector); // 应用连接器定制器`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} tomcat.setConnector(connector); // 设置默认连接器`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // ========== 步骤 5: 创建并配置 Context ==========`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // Context 代表一个 Web 应用`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} StandardContext context = new StandardContext();`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} context.setName(getContextPath()); // 设置上下文路径`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} context.setPath(getContextPath());`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // 配置资源加载`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} File docBase = new File(baseDir, "docbase"); // 文档基础目录`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} docBase.mkdirs();`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} context.setDocBase(docBase.getAbsolutePath());`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // 添加生命周期监听器`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // ========== 步骤 6: 应用自定义配置 ==========`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} customizeContext(context); // 应用上下文定制器`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // ========== 步骤 7: 创建 TomcatWebServer ==========`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // ========== 步骤 8: 注册 ServletContextInitializer ==========`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // 这些初始化器会在 Context 启动时被调用`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} for (ServletContextInitializer initializer : initializers) {`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} context.addServletContainerInitializer(`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} new ServletContextInitializerInitializer(initializer), `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} null`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} );`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} }`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} // ========== 步骤 9: 启动时自动部署 ==========`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} tomcat.getHost().addChild(context);`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} `
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
} return server;`
`#/**
* 创建并配置 Tomcat WebServer
* 源码版本:Spring Boot 3.2.x
*
* @param initializers Servlet 上下文初始化器数组
* @return 配置完成的 TomcatWebServer 实例
*/
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
// ========== 步骤 1: 创建 Tomcat 实例 ==========
Tomcat tomcat = new Tomcat();
// ========== 步骤 2: 配置基础目录 ==========
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat"); // 默认创建临时目录
tomcat.setBaseDir(baseDir.getAbsolutePath());
// ========== 步骤 3: 创建 Connector 连接器 ==========
// Connector 负责处理 HTTP 请求
Connector connector = new Connector(this.protocol); // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
connector.setThrowOnFailure(true);
// 应用端口和地址配置
connector.setPort(getPort()); // 从 AbstractServletWebServerFactory 继承
if (getAddress() != null) {
connector.setAddress(getAddress());
}
// ========== 步骤 4: 配置 Engine(引擎)==========
// Engine 是 Tomcat 的顶级容器,处理所有请求
tomcat.getService().addConnector(connector);
customizeConnector(connector); // 应用连接器定制器
tomcat.setConnector(connector); // 设置默认连接器
// ========== 步骤 5: 创建并配置 Context ==========
// Context 代表一个 Web 应用
StandardContext context = new StandardContext();
context.setName(getContextPath()); // 设置上下文路径
context.setPath(getContextPath());
// 配置资源加载
File docBase = new File(baseDir, "docbase"); // 文档基础目录
docBase.mkdirs();
context.setDocBase(docBase.getAbsolutePath());
// 添加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener()); // 修复 Context 生命周期
// ========== 步骤 6: 应用自定义配置 ==========
customizeContext(context); // 应用上下文定制器
// ========== 步骤 7: 创建 TomcatWebServer ==========
TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
// ========== 步骤 8: 注册 ServletContextInitializer ==========
// 这些初始化器会在 Context 启动时被调用
for (ServletContextInitializer initializer : initializers) {
context.addServletContainerInitializer(
new ServletContextInitializerInitializer(initializer),
null
);
}
// ========== 步骤 9: 启动时自动部署 ==========
tomcat.getHost().addChild(context);
return server;
}}
4.3 关键辅助方法
4.3.1 临时目录创建
java
#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
}/**`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} * 创建临时目录用于存放 Tomcat 运行时文件`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} * `
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} * @param prefix 目录前缀`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} * @return 创建的临时目录`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} */`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
}private File createTempDir(String prefix) {`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} try {`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} // 在系统临时目录下创建子目录`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} File tempDir = File.createTempFile(prefix + ".", "." + getPort());`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} tempDir.delete(); // 删除临时文件,准备创建同名目录`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} tempDir.mkdirs(); // 创建目录`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} `
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} // 设置 JVM 退出时删除(对于正常关闭)`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} tempDir.deleteOnExit();`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} `
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} return tempDir;`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} } catch (IOException ex) {`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} throw new IllegalStateException("Failed to create Tomcat temp directory", ex);`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
} }`
`#/**
* 创建临时目录用于存放 Tomcat 运行时文件
*
* @param prefix 目录前缀
* @return 创建的临时目录
*/
private File createTempDir(String prefix) {
try {
// 在系统临时目录下创建子目录
File tempDir = File.createTempFile(prefix + ".", "." + getPort());
tempDir.delete(); // 删除临时文件,准备创建同名目录
tempDir.mkdirs(); // 创建目录
// 设置 JVM 退出时删除(对于正常关闭)
tempDir.deleteOnExit();
return tempDir;
} catch (IOException ex) {
throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
}
}}
4.3.2 连接器定制
java
#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
}/**`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} * 应用所有连接器定制器`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} * `
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} * @param connector 待定制的连接器`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} */`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
}private void customizeConnector(Connector connector) {`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} // 遍历所有注册的定制器`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} customizer.customize(connector); // 委托给定制器处理`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} }`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} `
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} // 配置最大线程数(如果通过 ServerProperties 设置)`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} if (this.maxThreads != null) {`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} ProtocolHandler protocolHandler = connector.getProtocolHandler();`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} if (protocolHandler instanceof AbstractProtocol) {`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} }`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} }`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} `
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} // 配置最小线程数`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} if (this.minSpareThreads != null) {`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} ProtocolHandler protocolHandler = connector.getProtocolHandler();`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} if (protocolHandler instanceof AbstractProtocol) {`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} }`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} }`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} `
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
} // 其他配置...`
`#/**
* 应用所有连接器定制器
*
* @param connector 待定制的连接器
*/
private void customizeConnector(Connector connector) {
// 遍历所有注册的定制器
for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
customizer.customize(connector); // 委托给定制器处理
}
// 配置最大线程数(如果通过 ServerProperties 设置)
if (this.maxThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
}
}
// 配置最小线程数
if (this.minSpareThreads != null) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof AbstractProtocol) {
((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
}
}
// 其他配置...
}}
4.3.3 上下文定制
java
#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
}/**`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} * 应用所有上下文定制器`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} * `
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} * @param context 待定制的上下文`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} */`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
}private void customizeContext(StandardContext context) {`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} // 应用所有上下文定制器`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} customizer.customize(context);`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} }`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} `
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} // 添加 Valve(阀门 - Tomcat 的拦截机制)`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} for (Valve valve : this.contextValves) {`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} context.getPipeline().addValve(valve);`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} }`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} `
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} // 配置 Session 管理器`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} if (getSession() != null) {`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} // 应用自定义 Session 配置`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} // ...`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} }`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} `
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} // 配置资源处理`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
} // ...`
`#/**
* 应用所有上下文定制器
*
* @param context 待定制的上下文
*/
private void customizeContext(StandardContext context) {
// 应用所有上下文定制器
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
customizer.customize(context);
}
// 添加 Valve(阀门 - Tomcat 的拦截机制)
for (Valve valve : this.contextValves) {
context.getPipeline().addValve(valve);
}
// 配置 Session 管理器
if (getSession() != null) {
// 应用自定义 Session 配置
// ...
}
// 配置资源处理
// ...
}}
5. 内嵌 Tomcat 启动流程
5.1 完整启动时序图
sequenceDiagram
participant Main as main()
participant App as SpringApplication
participant Context as WebApplicationContext
participant Factory as TomcatServletWebServerFactory
participant Server as TomcatWebServer
participant Tomcat as Tomcat
Main->>App: run()
App->>Context: refresh()
Context->>Context: onRefresh()
Note over Context: 创建 WebServer
Context->>Factory: getWebServer(initializers)
Factory->>Factory: 创建 Tomcat 实例
Factory->>Factory: 配置 Connector
Factory->>Factory: 创建 StandardContext
Factory->>Factory: 应用定制器
Factory->>Server: new TomcatWebServer(tomcat)
Server-->>Context: 返回 WebServer
Context->>Context: finishRefresh()
Context->>Server: start()
Server->>Tomcat: start()
Tomcat->>Tomcat: 初始化 Engine
Tomcat->>Tomcat: 启动 Connector
Tomcat->>Tomcat: 启动 Context
Note over Tomcat: Tomcat 开始监听端口
Tomcat-->>Server: 启动完成
Server-->>Context: WebServer 运行中
Context-->>App: 上下文刷新完成
App-->>Main: 应用启动完成
5.2 启动流程详解
5.2.1 触发点:ServletWebServerApplicationContext
java
#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}/**`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} * Servlet Web 应用上下文`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} */`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}public class ServletWebServerApplicationContext extends GenericWebApplicationContext`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} implements ConfigurableWebServerApplicationContext {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} @Override`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} protected void onRefresh() {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} super.onRefresh();`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} `
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // ========== 关键步骤:创建 WebServer ==========`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} try {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} createWebServer();`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} } catch (Throwable ex) {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} throw new ApplicationContextException("Unable to start web server", ex);`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} }`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} }`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} /**`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} * 创建 WebServer 的核心逻辑`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} */`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} private void createWebServer() {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} WebServer webServer = this.webServer;`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} ServletContext servletContext = getServletContext();`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // 如果 WebServer 尚未创建`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} if (webServer == null && servletContext == null) {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} ServletWebServerFactory factory = getWebServerFactory();`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // ========== 步骤 2: 获取所有 ServletContextInitializer ==========`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // 包括:Servlet、Filter、Listener、错误页面等`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} selfInitialize();`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // ========== 步骤 3: 通过工厂创建 WebServer ==========`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} this.webServer = factory.getWebServer(getSelfInitializer());`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} } else if (servletContext != null) {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // 已存在 ServletContext(外部容器场景)`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} try {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} getSelfInitializer().onStartup(servletContext);`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} } catch (ServletException ex) {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} throw new ApplicationContextException("Cannot initialize servlet context", ex);`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} }`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} }`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // 初始化属性`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} initPropertySources();`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} }`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} /**`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} * 获取 WebServerFactory Bean`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} */`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} `
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} if (beanNames.length == 0) {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} "No ServletWebServerFactory bean was found in the context");`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} }`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} `
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} if (beanNames.length > 1) {`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} "Multiple ServletWebServerFactory beans found in the context: " `
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} + Arrays.toString(beanNames));`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} }`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} `
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
} }`
`#/**
* Servlet Web 应用上下文
* 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
*/
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
implements ConfigurableWebServerApplicationContext {
@Override
protected void onRefresh() {
super.onRefresh();
// ========== 关键步骤:创建 WebServer ==========
try {
createWebServer();
} catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
/**
* 创建 WebServer 的核心逻辑
*/
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
// 如果 WebServer 尚未创建
if (webServer == null && servletContext == null) {
// ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
ServletWebServerFactory factory = getWebServerFactory();
// ========== 步骤 2: 获取所有 ServletContextInitializer ==========
// 包括:Servlet、Filter、Listener、错误页面等
selfInitialize();
// ========== 步骤 3: 通过工厂创建 WebServer ==========
this.webServer = factory.getWebServer(getSelfInitializer());
} else if (servletContext != null) {
// 已存在 ServletContext(外部容器场景)
try {
getSelfInitializer().onStartup(servletContext);
} catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context", ex);
}
}
// 初始化属性
initPropertySources();
}
/**
* 获取 WebServerFactory Bean
*/
private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
// 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
// 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
if (beanNames.length == 0) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"No ServletWebServerFactory bean was found in the context");
}
if (beanNames.length > 1) {
throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
"Multiple ServletWebServerFactory beans found in the context: "
+ Arrays.toString(beanNames));
}
return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}
}}
5.2.2 TomcatWebServer 的 start() 方法
java
#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}/**`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} * TomcatWebServer 实现`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} */`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}public class TomcatWebServer implements WebServer {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} private final Tomcat tomcat;`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} private final boolean autoStart;`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} private volatile boolean started;`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} /**`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} * 构造函数`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} * @param tomcat 配置好的 Tomcat 实例`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} * @param autoStart 是否自动启动`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} */`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} public TomcatWebServer(Tomcat tomcat, boolean autoStart) {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} this.tomcat = tomcat;`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} this.autoStart = autoStart;`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} `
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} if (autoStart) {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // 构造时立即启动`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} start();`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} }`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} }`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} @Override`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} public synchronized void start() throws WebServerException {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} if (this.started) {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // 已启动,直接返回`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} return;`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} }`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} try {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // ========== 步骤 1: 启动 Tomcat ==========`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // 这会触发 Engine、Host、Context 等所有容器的启动`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} this.tomcat.start();`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} `
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // ========== 步骤 2: 等待启动完成 ==========`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // Tomcat 启动是异步的,需要确保完全启动`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // 主要是确保 Connector 绑定端口成功`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // ...`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // ========== 步骤 3: 获取实际监听端口 ==========`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // 主要用于动态端口(port=0)场景`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} Connector connector = this.tomcat.getConnector();`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} int actualPort = connector.getLocalPort();`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} if (actualPort < 0) {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} throw new WebServerException("Connector failed to start");`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} }`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // ========== 步骤 4: 发布启动事件 ==========`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} publishStartEvent();`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} this.started = true;`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} `
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} logger.info("Tomcat started on port(s): " + actualPort `
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} + " with context path '" + getContextPath() + "'");`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} `
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} } catch (Exception ex) {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} throw new WebServerException("Unable to start embedded Tomcat", ex);`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} }`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} }`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} /**`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} * 停止 WebServer`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} */`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} @Override`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} public synchronized void stop() throws WebServerException {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} if (!this.started) {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} return;`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} }`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} try {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} // 停止 Tomcat`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} this.tomcat.stop();`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} this.tomcat.destroy();`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} `
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} this.started = false;`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} `
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} logger.info("Tomcat stopped");`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} `
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} } catch (Exception ex) {`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} throw new WebServerException("Unable to stop embedded Tomcat", ex);`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} }`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
} }`
`#/**
* TomcatWebServer 实现
* 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
*/
public class TomcatWebServer implements WebServer {
private final Tomcat tomcat;
private final boolean autoStart;
private volatile boolean started;
/**
* 构造函数
* @param tomcat 配置好的 Tomcat 实例
* @param autoStart 是否自动启动
*/
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.tomcat = tomcat;
this.autoStart = autoStart;
if (autoStart) {
// 构造时立即启动
start();
}
}
@Override
public synchronized void start() throws WebServerException {
if (this.started) {
// 已启动,直接返回
return;
}
try {
// ========== 步骤 1: 启动 Tomcat ==========
// 这会触发 Engine、Host、Context 等所有容器的启动
this.tomcat.start();
// ========== 步骤 2: 等待启动完成 ==========
// Tomcat 启动是异步的,需要确保完全启动
// 主要是确保 Connector 绑定端口成功
// ...
// ========== 步骤 3: 获取实际监听端口 ==========
// 主要用于动态端口(port=0)场景
Connector connector = this.tomcat.getConnector();
int actualPort = connector.getLocalPort();
if (actualPort < 0) {
throw new WebServerException("Connector failed to start");
}
// ========== 步骤 4: 发布启动事件 ==========
publishStartEvent();
this.started = true;
logger.info("Tomcat started on port(s): " + actualPort
+ " with context path '" + getContextPath() + "'");
} catch (Exception ex) {
throw new WebServerException("Unable to start embedded Tomcat", ex);
}
}
/**
* 停止 WebServer
*/
@Override
public synchronized void stop() throws WebServerException {
if (!this.started) {
return;
}
try {
// 停止 Tomcat
this.tomcat.stop();
this.tomcat.destroy();
this.started = false;
logger.info("Tomcat stopped");
} catch (Exception ex) {
throw new WebServerException("Unable to stop embedded Tomcat", ex);
}
}
}}
5.3 启动流程关键节点
flowchart TD
A[SpringApplication.run] --> B[ApplicationContext.refresh]
B --> C[onRefresh 触发]
C --> D[createWebServer]
D --> E[获取 ServletWebServerFactory Bean]
E --> F{是否存在?}
F -->|否| G[抛出异常]
F -->|是| H[获取 ServletContextInitializers]
H --> I[FilterRegistrationBean]
H --> J[ServletRegistrationBean]
H --> K[其他Initializer]
I --> L[factory.getWebServer]
J --> L
K --> L
L --> M[创建 Tomcat 实例]
M --> N[配置 Connector]
N --> O[创建 StandardContext]
O --> P[应用定制器]
P --> Q[返回 TomcatWebServer]
Q --> R[finishRefresh]
R --> S[webServer.start]
S --> T[Tomcat.start]
T --> U[Engine 启动]
U --> V[Host 启动]
V --> W[Context 启动]
W --> X[Connector 启动]
X --> Y[开始监听端口]
style G fill:#ff9999
style Y fill:#99ff99
6. 自定义配置与扩展
6.1 配置方式对比
| 配置方式 | 适用场景 | 优先级 | 示例 |
|---|---|---|---|
| application.yml | 常规配置(端口、线程等) | 低 | server.port=8080 |
| WebServerFactoryCustomizer | 编程式定制 | 中 | 实现 Bean |
| TomcatConnectorCustomizer | 连接器级定制 | 高 | 协议、SSL |
| TomcatContextCustomizer | 上下文级定制 | 高 | Valve、资源 |
6.2 方式一:application.yml 配置
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false# application.yml
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: falseserver:
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false # 基础配置
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false port: 8080
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false servlet:
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false context-path: /app
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false encoding:
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false charset: UTF-8
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false enabled: true
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false force: true
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false # Tomcat 特定配置
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false tomcat:
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false # 线程池配置
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false threads:
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false max: 200 # 最大工作线程数
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false min-spare: 10 # 最小空闲线程数
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false # 连接配置
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false max-connections: 8192 # 最大连接数
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false accept-count: 100 # 等待队列长度
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false connection-timeout: 20000 # 连接超时(毫秒)
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false # 其他配置
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false uri-encoding: UTF-8
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false max-http-form-post-size: 2MB
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false redirect-context-root: true
# application.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /app
encoding:
charset: UTF-8
enabled: true
force: true
# Tomcat 特定配置
tomcat:
# 线程池配置
threads:
max: 200 # 最大工作线程数
min-spare: 10 # 最小空闲线程数
# 连接配置
max-connections: 8192 # 最大连接数
accept-count: 100 # 等待队列长度
connection-timeout: 20000 # 连接超时(毫秒)
# 其他配置
uri-encoding: UTF-8
max-http-form-post-size: 2MB
redirect-context-root: true
use-relative-redirects: false use-relative-redirects: false
6.3 方式二:WebServerFactoryCustomizer Bean
java
#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
}/**`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} * WebServerFactoryCustomizer 示例`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} * 这是 Spring Boot 推荐的编程式定制方式`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} */`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
}@Configuration`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
}public class TomcatCustomizationConfiguration {`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
}`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} /**`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} * 定制 TomcatServletWebServerFactory`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} */`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} @Bean`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} @Override`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} public void customize(TomcatServletWebServerFactory factory) {`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // ========== 基础配置 ==========`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} factory.setPort(8080);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} factory.setContextPath("/myapp");`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} factory.setBaseDirectory(new File("/tmp/tomcat"));`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // ========== 连接器定制 ==========`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} @Override`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} public void customize(Connector connector) {`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // 配置连接超时`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} protocol.setConnectionTimeout(30000);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // 配置最大线程数`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} protocol.setMaxThreads(200);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} protocol.setMinSpareThreads(20);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // 配置最大连接数`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} protocol.setMaxConnections(1000);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // 启用压缩`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} protocol.setCompression("on");`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} protocol.setCompressionMinSize(1024); // 1KB 以上压缩`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // 配置 Keep-Alive`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} protocol.setKeepAliveTimeout(60000);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} protocol.setMaxKeepAliveRequests(100);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} }`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} });`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
}`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // ========== 上下文定制 ==========`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} factory.addContextCustomizers(new TomcatContextCustomizer() {`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} @Override`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} public void customize(Context context) {`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // 添加 Valve(类似 Filter,但更底层)`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} context.addValve(new AccessLogValve());`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // 配置 Session 管理`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} StandardManager manager = new StandardManager();`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} manager.setSessionTimeout(30); // 30 分钟超时`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} context.setManager(manager);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // 配置资源`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} StandardRoot resources = new StandardRoot(context);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} resources.setCachingAllowed(true);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} resources.setCacheMaxSize(10240 * 1024); // 10MB`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} context.setResources(resources);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} }`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} });`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
}`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // ========== URI 编码 ==========`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} factory.setUriEncoding(StandardCharsets.UTF_8);`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} `
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} // ========== 后台处理器延迟 ==========`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} factory.setBackgroundProcessorDelay(30); // 30 秒`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} }`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} };`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
} }`
`#/**
* WebServerFactoryCustomizer 示例
* 这是 Spring Boot 推荐的编程式定制方式
*/
@Configuration
public class TomcatCustomizationConfiguration {
/**
* 定制 TomcatServletWebServerFactory
*/
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ========== 基础配置 ==========
factory.setPort(8080);
factory.setContextPath("/myapp");
factory.setBaseDirectory(new File("/tmp/tomcat"));
// ========== 连接器定制 ==========
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 配置连接超时
protocol.setConnectionTimeout(30000);
// 配置最大线程数
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// 配置最大连接数
protocol.setMaxConnections(1000);
// 启用压缩
protocol.setCompression("on");
protocol.setCompressionMinSize(1024); // 1KB 以上压缩
// 配置 Keep-Alive
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
}
});
// ========== 上下文定制 ==========
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
// 添加 Valve(类似 Filter,但更底层)
context.addValve(new AccessLogValve());
// 配置 Session 管理
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟超时
context.setManager(manager);
// 配置资源
StandardRoot resources = new StandardRoot(context);
resources.setCachingAllowed(true);
resources.setCacheMaxSize(10240 * 1024); // 10MB
context.setResources(resources);
}
});
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
// ========== 后台处理器延迟 ==========
factory.setBackgroundProcessorDelay(30); // 30 秒
}
};
}
}}
6.4 方式三:直接定制器 Bean(推荐)
java
#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}/**`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * Spring Boot 3.x 推荐的简化方式`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 直接注册 Customizer Bean,无需嵌套`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} */`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}@Configuration`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}public class TomcatCustomizers {`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} /**`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 连接器定制器`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} */`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} @Bean`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} public TomcatConnectorCustomizer connectionCustomizer() {`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} return connector -> {`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 性能调优 ==========`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setConnectionTimeout(30000);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setMaxThreads(200);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setMinSpareThreads(10);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setMaxConnections(8192);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setAcceptCount(100);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} `
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 优化参数 ==========`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setTcpNoDelay(true); // 禁用 Nagle 算法`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setKeepAliveTimeout(60000); // 60 秒`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setMaxKeepAliveRequests(100);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} `
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 压缩配置 ==========`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setCompression("on");`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setCompressionMinSize(2048); // 2KB 以上压缩`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} };`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} }`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} /**`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 上下文定制器`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} */`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} @Bean`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} public TomcatContextCustomizer contextCustomizer() {`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} return context -> {`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 添加访问日志 Valve ==========`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} AccessLogValve accessLogValve = new AccessLogValve();`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setDirectory("logs");`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setPrefix("access_log");`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setSuffix(".txt");`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setRotatable(true);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} context.getPipeline().addValve(accessLogValve);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} `
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 添加错误报告 Valve ==========`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} ErrorReportValve errorReportValve = new ErrorReportValve();`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} context.getPipeline().addValve(errorReportValve);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} `
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== Session 配置 ==========`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} StandardManager manager = new StandardManager();`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} manager.setSessionTimeout(30); // 30 分钟`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} `
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} context.setManager(manager);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} `
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 资源缓存配置 ==========`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} WebResourceRoot resources = context.getResources();`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} if (resources instanceof StandardRoot) {`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} StandardRoot standardRoot = (StandardRoot) resources;`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} standardRoot.setCachingAllowed(true);`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} }`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} };`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} }`
`#/**
* Spring Boot 3.x 推荐的简化方式
* 直接注册 Customizer Bean,无需嵌套
*/
@Configuration
public class TomcatCustomizers {
/**
* 连接器定制器
*/
@Bean
public TomcatConnectorCustomizer connectionCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 性能调优 ==========
protocol.setConnectionTimeout(30000);
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(10);
protocol.setMaxConnections(8192);
protocol.setAcceptCount(100);
// ========== 优化参数 ==========
protocol.setTcpNoDelay(true); // 禁用 Nagle 算法
protocol.setKeepAliveTimeout(60000); // 60 秒
protocol.setMaxKeepAliveRequests(100);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048); // 2KB 以上压缩
protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
};
}
/**
* 上下文定制器
*/
@Bean
public TomcatContextCustomizer contextCustomizer() {
return context -> {
// ========== 添加访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log");
accessLogValve.setSuffix(".txt");
accessLogValve.setRotatable(true);
context.getPipeline().addValve(accessLogValve);
// ========== 添加错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false); // 不显示详细错误信息(安全)
context.getPipeline().addValve(errorReportValve);
// ========== Session 配置 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 资源缓存配置 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}}
6.5 定制器执行顺序
sequenceDiagram
participant Factory as TomcatServletWebServerFactory
participant Customizer1 as WebServerFactoryCustomizer
participant Connector as ConnectorCustomizer
participant Context as ContextCustomizer
Factory->>Customizer1: customize(factory)
Note over Customizer1: 1. 配置基础属性(端口、路径等)
Customizer1->>Factory: addConnectorCustomizers()
Customizer1->>Factory: addContextCustomizers()
Factory->>Factory: getWebServer(initializers)
Factory->>Factory: 创建 Connector
Factory->>Connector: customize(connector)
Note over Connector: 2. 配置连接器(线程、超时等)
Factory->>Factory: 创建 Context
Factory->>Context: customize(context)
Note over Context: 3. 配置上下文(Valve、Session等)
Factory->>Factory: 创建 TomcatWebServer
7. 实战案例:构建生产级配置
7.1 完整的生产级配置类
java
#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}package com.example.demo.config;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.apache.catalina.Context;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.apache.catalina.Engine;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.apache.catalina.Valve;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.apache.catalina.connector.Connector;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.apache.catalina.valves.AccessLogValve;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.apache.catalina.valves.ErrorReportValve;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.apache.coyote.http11.Http11NioProtocol;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.springframework.boot.web.server.WebServerFactoryCustomizer;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.springframework.context.annotation.Bean;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.springframework.context.annotation.Configuration;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import org.springframework.core.Ordered;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import java.io.File;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}import java.nio.charset.StandardCharsets;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}/**`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 生产级 Tomcat 配置`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * `
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 功能点:`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 1. 性能调优(线程池、连接池、Keep-Alive)`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 2. 压缩优化`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 3. 访问日志`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 4. Session 管理`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 5. 安全加固`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 6. 资源缓存`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} */`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}@Configuration`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}public class ProductionTomcatConfiguration {`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} /**`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 顶级定制器 - 配置基础属性`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} */`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} @Bean`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} return factory -> {`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 基础连接配置 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} factory.setPort(8080);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} `
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 上下文路径 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} factory.setContextPath("/api");`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} `
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== Tomcat 基础目录 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} File baseDir = new File("/var/opt/tomcat");`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} if (!baseDir.exists()) {`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} baseDir.mkdirs();`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} }`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} factory.setBaseDirectory(baseDir);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} `
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== URI 编码 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} factory.setUriEncoding(StandardCharsets.UTF_8);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} };`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} }`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} /**`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 连接器性能定制器`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} */`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} @Bean`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} public TomcatConnectorCustomizer performanceConnectorCustomizer() {`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} return connector -> {`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 线程池配置 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setMaxThreads(200);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setMinSpareThreads(20);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 连接池配置 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setMaxConnections(8192);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setAcceptCount(200);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 超时配置 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setConnectionTimeout(30000);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setKeepAliveTimeout(60000);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setMaxKeepAliveRequests(100);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== TCP 参数优化 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setTcpNoDelay(true);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} connector.setEnableLookups(false);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 压缩配置 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setCompression("on");`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setCompressionMinSize(2048);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} protocol.setCompressableMimeType(`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} "text/html,text/xml,text/plain,text/css," +`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} "text/javascript,application/javascript,application/json"`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} );`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} };`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} }`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} /**`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} * 上下文功能定制器`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} */`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} @Bean`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} public TomcatContextCustomizer productionContextCustomizer() {`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} return context -> {`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 1. 访问日志 Valve ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} AccessLogValve accessLogValve = new AccessLogValve();`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setPattern(`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} );`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setDirectory("logs");`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setPrefix("access_log.");`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setSuffix(".log");`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} accessLogValve.setRotate(true);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} context.getPipeline().addValve(accessLogValve);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 2. 安全错误报告 Valve ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} ErrorReportValve errorReportValve = new ErrorReportValve();`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} errorReportValve.setShowReport(false);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} errorReportValve.setShowServerInfo(false);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} context.getPipeline().addValve(errorReportValve);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 3. Session 管理 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} StandardManager manager = new StandardManager();`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} manager.setSessionTimeout(30); // 30 分钟`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} context.setManager(manager);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} // ========== 4. 静态资源缓存 ==========`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} WebResourceRoot resources = context.getResources();`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} if (resources instanceof StandardRoot) {`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} StandardRoot standardRoot = (StandardRoot) resources;`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} standardRoot.setCachingAllowed(true);`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} }`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} };`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
} }`
`#package com.example.demo.config;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.File;
import java.nio.charset.StandardCharsets;
/**
* 生产级 Tomcat 配置
*
* 功能点:
* 1. 性能调优(线程池、连接池、Keep-Alive)
* 2. 压缩优化
* 3. 访问日志
* 4. Session 管理
* 5. 安全加固
* 6. 资源缓存
*/
@Configuration
public class ProductionTomcatConfiguration {
/**
* 顶级定制器 - 配置基础属性
* 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
return factory -> {
// ========== 基础连接配置 ==========
factory.setPort(8080);
// ========== 上下文路径 ==========
factory.setContextPath("/api");
// ========== Tomcat 基础目录 ==========
File baseDir = new File("/var/opt/tomcat");
if (!baseDir.exists()) {
baseDir.mkdirs();
}
factory.setBaseDirectory(baseDir);
// ========== URI 编码 ==========
factory.setUriEncoding(StandardCharsets.UTF_8);
};
}
/**
* 连接器性能定制器
*/
@Bean
public TomcatConnectorCustomizer performanceConnectorCustomizer() {
return connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 线程池配置 ==========
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
// ========== 连接池配置 ==========
protocol.setMaxConnections(8192);
protocol.setAcceptCount(200);
// ========== 超时配置 ==========
protocol.setConnectionTimeout(30000);
protocol.setKeepAliveTimeout(60000);
protocol.setMaxKeepAliveRequests(100);
// ========== TCP 参数优化 ==========
protocol.setTcpNoDelay(true);
connector.setEnableLookups(false);
// ========== 压缩配置 ==========
protocol.setCompression("on");
protocol.setCompressionMinSize(2048);
protocol.setCompressableMimeType(
"text/html,text/xml,text/plain,text/css," +
"text/javascript,application/javascript,application/json"
);
};
}
/**
* 上下文功能定制器
*/
@Bean
public TomcatContextCustomizer productionContextCustomizer() {
return context -> {
// ========== 1. 访问日志 Valve ==========
AccessLogValve accessLogValve = new AccessLogValve();
accessLogValve.setPattern(
"%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
);
accessLogValve.setDirectory("logs");
accessLogValve.setPrefix("access_log.");
accessLogValve.setSuffix(".log");
accessLogValve.setRotate(true);
context.getPipeline().addValve(accessLogValve);
// ========== 2. 安全错误报告 Valve ==========
ErrorReportValve errorReportValve = new ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
context.getPipeline().addValve(errorReportValve);
// ========== 3. Session 管理 ==========
StandardManager manager = new StandardManager();
manager.setSessionTimeout(30); // 30 分钟
context.setManager(manager);
// ========== 4. 静态资源缓存 ==========
WebResourceRoot resources = context.getResources();
if (resources instanceof StandardRoot) {
StandardRoot standardRoot = (StandardRoot) resources;
standardRoot.setCachingAllowed(true);
standardRoot.setCacheMaxSize(10 * 1024 * 1024); // 10MB
standardRoot.setCacheObjectMaxSize(512 * 1024); // 512KB
}
};
}
}}
7.2 配置参数对照表
| 配置项 | 默认值 | 推荐值(生产) | 说明 |
|---|---|---|---|
| maxThreads | 200 | 200-500 | 最大工作线程数 |
| minSpareThreads | 10 | 20-50 | 最小空闲线程数 |
| maxConnections | 8192 | 8192-10000 | 最大连接数 |
| acceptCount | 100 | 200-500 | 等待队列长度 |
| connectionTimeout | 20000ms | 30000ms | 连接超时 |
| keepAliveTimeout | 60000ms | 60000ms | Keep-Alive 超时 |
| maxKeepAliveRequests | 100 | 100 | 单连接最大请求数 |
| compression | off | on | Gzip 压缩 |
| compressionMinSize | 2048 | 2048 | 最小压缩阈值 |
7.3 压测与调优建议
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/# ========== Apache Bench 压测示例 ==========
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/# 1. 基础压测(1000 请求,100 并发)
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ab -n 1000 -c 100 http://localhost:8080/api/health
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/# 2. 持续压测(10000 请求,200 并发)
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ab -n 10000 -c 200 http://localhost:8080/api/users
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/# 3. POST 请求压测
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/# ========== JVM 参数建议 ==========
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/java -jar app.jar \
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ -Xms4g \
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ -Xmx4g \
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ -XX:+UseG1GC \
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ -XX:MaxGCPauseMillis=200 \
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ -XX:+HeapDumpOnOutOfMemoryError \
# ========== Apache Bench 压测示例 ==========
# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health
# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users
# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== JVM 参数建议 ==========
java -jar app.jar \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ -XX:HeapDumpPath=/var/log/app/
8. 总结与最佳实践
8.1 核心要点回顾
mindmap
root((Spring Boot<br/>内嵌 Tomcat))
核心设计
工厂模式
ServletWebServerFactory
TomcatServletWebServerFactory
策略模式
多容器支持
自动配置决策
启动流程
ApplicationContext.refresh
onRefresh 触发
createWebServer
TomcatWebServer.start
Tomcat.start
Engine/Host/Context/Connector
配置体系
application.yml
基础配置
ServerProperties
WebServerFactoryCustomizer
编程式定制
灵活扩展
TomcatConnectorCustomizer
连接器配置
性能调优
TomcatContextCustomizer
上下文配置
Valve/Session
8.2 最佳实践清单
✅ 配置层面
| 项目 | 建议 | 原因 |
|---|---|---|
| 端口配置 | 不要使用 80/443(需 root 权限) | 安全性 |
| 线程池 | maxThreads=200-500 | 避免上下文切换开销 |
| Keep-Alive | enable + timeout=60s | 减少 TCP 握手开销 |
| 压缩 | enable + minSize=2KB | 节省带宽,提升响应速度 |
| Session | timeout=30min + HttpOnly | 平衡用户体验与安全性 |
| 日志 | AccessLogValve + 日期格式 | 便于问题排查与审计 |
✅ 性能优化
java
#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)// ========== 性能优化 Top 5 ==========`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)1. 启用 Gzip 压缩(节省带宽 60-80%)`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)2. 调整线程池大小(根据压测结果)`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)3. 启用 Keep-Alive(减少 TCP 握手)`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)4. 静态资源缓存(减少 IO)`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)5. 禁用 DNS 反向查询(enableLookups=false)
✅ 安全加固
java
#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)// ========== 安全加固 Top 5 ==========`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)1. 禁用 TRACE 方法(防止 XST 攻击)`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)2. 隐藏服务器版本信息(ErrorReportValve)`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)3. Session Cookie 设置 HttpOnly + Secure`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)4. 限制请求大小(maxPostSize)`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)5. 启用 HTTPS(生产环境必须)
✅ 监控与诊断
java
#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)// ========== 监控指标 ==========`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)1. 请求 QPS(每秒查询数)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)2. 响应时间(P50/P95/P99)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)3. 错误率(4xx/5xx)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)4. 线程池使用率`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)5. GC 暂停时间`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)// ========== 诊断工具 ==========`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- JConsole / JVisualVM(本地)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- Prometheus + Grafana(生产环境)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- Arthas(在线诊断)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- Thread Dump(死锁分析)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间
// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- Heap Dump(内存泄漏)
8.3 常见问题排查
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| 端口占用 | 8080 被其他进程占用 | netstat -tunlp | grep 8080 |
| OOM | 内存泄漏或堆内存不足 | Heap Dump 分析 |
| CPU 100% | 死循环或 GC 频繁 | Thread Dump + GC 日志 |
| 响应慢 | 数据库/网络瓶颈 | 慢查询日志 + 压测 |
| 连接数满 | maxConnections 太小 | 调整连接池大小 |
8.4 进阶阅读
- Tomcat 官方文档:https://tomcat.apache.org/tomcat-10.1-doc/
- Spring Boot 文档:https://docs.spring.io/spring-boot/docs/current/reference/html/web.html
- HTTP/2 配置:https://tomcat.apache.org/tomcat-10.1-doc/config/http2.html
- APR/Native 优化:https://tomcat.apache.org/tomcat-10.1-doc/apr.html
附录:完整配置示例
application.yml 完整版
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd# application-production.yml
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-ddserver:
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd # 基础配置
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd port: 8080
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd servlet:
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd context-path: /api
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd encoding:
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd charset: UTF-8
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd enabled: true
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd force: true
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd force-request: true
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd force-response: true
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd # Tomcat 配置
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd tomcat:
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd # 基础目录
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd basedir: /var/opt/tomcat
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd # 线程池
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd threads:
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd max: 200
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd min-spare: 20
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd # 连接配置
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd max-connections: 8192
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd accept-count: 200
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd connection-timeout: 30s
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd # URI 编码
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd uri-encoding: UTF-8
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd # 最大 POST 大小
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd max-http-form-post-size: 10MB
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd # 访问日志
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd accesslog:
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd enabled: true
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd directory: logs
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd prefix: access_log.
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd suffix: .log
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd rotate: true
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd rename-on-rotate: true
# application-production.yml
server:
# 基础配置
port: 8080
servlet:
context-path: /api
encoding:
charset: UTF-8
enabled: true
force: true
force-request: true
force-response: true
# Tomcat 配置
tomcat:
# 基础目录
basedir: /var/opt/tomcat
# 线程池
threads:
max: 200
min-spare: 20
# 连接配置
max-connections: 8192
accept-count: 200
connection-timeout: 30s
# URI 编码
uri-encoding: UTF-8
# 最大 POST 大小
max-http-form-post-size: 10MB
# 访问日志
accesslog:
enabled: true
pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
directory: logs
prefix: access_log.
suffix: .log
rotate: true
rename-on-rotate: true
file-date-format: yyyy-MM-dd file-date-format: yyyy-MM-dd
文末总结:
Spring Boot 的内嵌 Tomcat 机制通过优雅的工厂模式和自动配置,极大简化了 Web 应用的部署。理解其背后的 ServletWebServerFactory 体系,不仅能帮助我们更好地排查问题,更能根据业务需求进行精准的性能调优和安全加固。本文从源码层面剖析了整个启动流程,并提供了完整的生产级配置示例,希望能为您的 Spring Boot 应用提供有力支撑。
相关文章推荐:
标签: Spring Boot Tomcat 内嵌容器 WebServerFactory 源码解析 性能调优