文章目录
使用自带的tomcat
//server.xml: Service -> Engine -> Host -> Valve
<Valve
className="org.apache.catalina.valves.RemoteIpValve"
internalProxies="192\.168\.0\.10|192\.168\.0\.11"
remoteIpHeader="x-forwarded-for"
proxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"
/>
springboot 使用内置的tomcat
默认使用 tomcat,还可以使用其他 web 服务(如 Jetty, Reactor Netty, Undertow)
服务器命名空间中的配置属性在 application.properties 中的配置项皆以 server 为前缀
1、配置application.properties 文件内容
通过 application.properties 中前缀是 server.tomcat 的配置项,自定义内置tomcat参数。
例如
后端开发者希望获取应用的代理机器IP地址,而不是应用的托管机器的地址。 通常,
将 server.use-forward-headers 设置为true,开启对请求头进行处理,tomcat 会自动利用 org.apache.catalina.valves.RemoteIpValve#invoke,根据一定规则对每个request请求处理。
server.use-forward-headers=true
# 默认为false。当为false时,可以利用TomcatServletWebServerFactory 自定义 RemoteIpValve;
2、自定义扩展WebServerFactoryCustomizer的定制器
当默认的web服务没有我们需要的参数,或需要额外的web server 操作时
通常可以向其添加定制器以配置特定部件,例如连接器,服务器资源或服务器本身 - 所有这些都使用特定于服务器的API。
通过自定义继承了WebServerFactoryCustomizer<web stack >类的 MyWebServerFactoryCustomizer,在 customize 方法中加入 需要的操作逻辑。
@Component
public class MyTomcatWebServerCustomizer
implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// customize the factory here
}
}
web statck 分为 Servlet stack 和 Reactive stack;
Servlet stack
Reactive stack
3、自定义扩展 WebServerFactory 的组件
它将覆盖Spring Boot提供的组件。 在这种情况下,您不能再依赖服务器命名空间中的配置属性。
// 为tomcat 开启多个 connector
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector());
return tomcat;
}
private Connector createSslConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
try {
File keystore = new ClassPathResource("keystore").getFile();
File truststore = new ClassPathResource("keystore").getFile();
connector.setScheme("https");
connector.setSecure(true);
connector.setPort(8443);
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(keystore.getAbsolutePath());
protocol.setKeystorePass("changeit");
protocol.setTruststoreFile(truststore.getAbsolutePath());
protocol.setTruststorePass("changeit");
protocol.setKeyAlias("apitester");
return connector;
}
catch (IOException ex) {
throw new IllegalStateException("can't access keystore: [" + "keystore"
+ "] or truststore: [" + "keystore" + "]", ex);
}
}