SpringBoot 2.0 系列007 --WEB容器详解
我们知道java常用的两大容器tomcat和jetty,其中SB默认内嵌了tomcat容器。那么SB都支持什么属性呢?
- 参阅ServerProperties.java
基本是通用的服务器配置,以及error、Compression、Http2、Servlet、Tomcat、Jetty、Undertow等配置。
可用配置
1. 通用服务配置
port
服务器端口号
- 使用方式
server.port=8080,默認端口号8080
address
服务绑定的网络地址
- 使用方式
server.address=127.0.0.1
useForwardHeaders
请求是否允许X-Forwarded-*
- 使用方式
server.use-forward-headers=false
serverHeader
服务响应头信息
- 使用方式
server.server-header=xxxx
maxHttpHeaderSize
最大头信息大小
- 使用方式
server.max-http-header-size=0
connectionTimeout
连接超时时间
- 使用方式
server.connection-timeout=-1
2. ssl
主要是ssl相关配置。具体参阅 org.springframework.boot.web.server.Ssl类
- 使用方式
server.ssl.xxx=xxx
server.ssl.ciphers= # Supported SSL ciphers. server.ssl.client-auth= # Whether client authentication is wanted ("want") or needed ("need"). Requires a trust store. server.ssl.enabled= # Enable SSL support. server.ssl.enabled-protocols= # Enabled SSL protocols. server.ssl.key-alias= # Alias that identifies the key in the key store. server.ssl.key-password= # Password used to access the key in the key store. server.ssl.key-store= # Path to the key store that holds the SSL certificate (typically a jks file). server.ssl.key-store-password= # Password used to access the key store. server.ssl.key-store-provider= # Provider for the key store. server.ssl.key-store-type= # Type of the key store. server.ssl.protocol=TLS # SSL protocol to use. server.ssl.trust-store= # Trust store that holds SSL certificates. server.ssl.trust-store-password= # Password used to access the trust store. server.ssl.trust-store-provider= # Provider for the trust store. server.ssl.trust-store-type= # Type of the trust store.
public class Ssl { /** * Whether to enable SSL support. */ private boolean enabled = true; /** * Whether client authentication is wanted ("want") or needed ("need"). Requires a * trust store. */ private ClientAuth clientAuth; /** * Supported SSL ciphers. */ private String[] ciphers; /** * Enabled SSL protocols. */ private String[] enabledProtocols; /** * Alias that identifies the key in the key store. */ private String keyAlias; /** * Password used to access the key in the key store. */ private String keyPassword; /** * Path to the key store that holds the SSL certificate (typically a jks file). */ private String keyStore; /** * Password used to access the key store. */ private String keyStorePassword; /** * Type of the key store. */ private String keyStoreType; /** * Provider for the key store. */ private String keyStoreProvider; /** * Trust store that holds SSL certificates. */ private String trustStore; /** * Password used to access the trust store. */ private String trustStorePassword; /** * Type of the trust store. */ private String trustStoreType; /** * Provider for the trust store. */ private String trustStoreProvider; /** * SSL protocol to use. */ private String protocol = "TLS"; public boolean isEnabled() { return this.enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public ClientAuth getClientAuth() { return this.clientAuth; } public void setClientAuth(ClientAuth clientAuth) { this.clientAuth = clientAuth; } public String[] getCiphers() { return this.ciphers; } public void setCiphers(String[] ciphers) { this.ciphers = ciphers; } public String getKeyAlias() { return this.keyAlias; } public void setKeyAlias(String keyAlias) { this.keyAlias = keyAlias; } public String getKeyPassword() { return this.keyPassword; } public void setKeyPassword(String keyPassword) { this.keyPassword = keyPassword; } public String getKeyStore() { return this.keyStore; } public void setKeyStore(String keyStore) { this.keyStore = keyStore; } public String getKeyStorePassword() { return this.keyStorePassword; } public void setKeyStorePassword(String keyStorePassword) { this.keyStorePassword = keyStorePassword; } public String getKeyStoreType() { return this.keyStoreType; } public void setKeyStoreType(String keyStoreType) { this.keyStoreType = keyStoreType; } public String getKeyStoreProvider() { return this.keyStoreProvider; } public void setKeyStoreProvider(String keyStoreProvider) { this.keyStoreProvider = keyStoreProvider; } public String[] getEnabledProtocols() { return this.enabledProtocols; } public void setEnabledProtocols(String[] enabledProtocols) { this.enabledProtocols = enabledProtocols; } public String getTrustStore() { return this.trustStore; } public void setTrustStore(String trustStore) { this.trustStore = trustStore; } public String getTrustStorePassword() { return this.trustStorePassword; } public void setTrustStorePassword(String trustStorePassword) { this.trustStorePassword = trustStorePassword; } public String getTrustStoreType() { return this.trustStoreType; } public void setTrustStoreType(String trustStoreType) { this.trustStoreType = trustStoreType; } public String getTrustStoreProvider() { return this.trustStoreProvider; } public void setTrustStoreProvider(String trustStoreProvider) { this.trustStoreProvider = trustStoreProvider; } public String getProtocol() { return this.protocol; } public void setProtocol(String protocol) { this.protocol = protocol; } /** * Client authentication types. */ public enum ClientAuth { /** * Client authentication is wanted but not mandatory. */ WANT, /** * Client authentication is needed and mandatory. */ NEED } }
3. compression
简单的压缩配置,具体参阅org.springframework.boot.web.server.Compression
- 使用方式
server.compression.xx=xx
server.compression.enabled=false # Whether response compression is enabled. server.compression.excluded-user-agents= # List of user-agents to exclude from compression. server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript # Comma-separated list of MIME types that should be compressed. server.compression.min-response-size=2048 # Minimum "Content-Length" value that is required for compression to be performed.
- 附源码
public class Compression { /** * Whether response compression is enabled. */ private boolean enabled = false; /** * Comma-separated list of MIME types that should be compressed. */ private String[] mimeTypes = new String[] { "text/html", "text/xml", "text/plain", "text/css", "text/javascript", "application/javascript", "application/json", "application/xml" }; /** * Comma-separated list of user agents for which responses should not be compressed. */ private String[] excludedUserAgents = null; /** * Minimum "Content-Length" value that is required for compression to be performed. */ private int minResponseSize = 2048; public boolean getEnabled() { return this.enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public String[] getMimeTypes() { return this.mimeTypes; } public void setMimeTypes(String[] mimeTypes) { this.mimeTypes = mimeTypes; } public int getMinResponseSize() { return this.minResponseSize; } public void setMinResponseSize(int minSize) { this.minResponseSize = minSize; } public String[] getExcludedUserAgents() { return this.excludedUserAgents; } public void setExcludedUserAgents(String[] excludedUserAgents) { this.excludedUserAgents = excludedUserAgents; } }
4. http2
主要是开启http2的支持,具体参阅org.springframework.boot.web.server.Http2
- 使用方式
server.http2.enabled=false
5. servlet
主要是servlet相关的配置,具体参阅org.springframework.boot.autoconfigure.web.ServerProperties.Servlet
- 使用方式
server.servlet.contextPath=/chapter01
server.servlet.context-parameters.*= # Servlet context init parameters. server.servlet.context-path= # Context path of the application. server.servlet.application-display-name=application # Display name of the application. server.servlet.jsp.class-name=org.apache.jasper.servlet.JspServlet # The class name of the JSP servlet. server.servlet.jsp.init-parameters.*= # Init parameters used to configure the JSP servlet. server.servlet.jsp.registered=true # Whether the JSP servlet is registered. server.servlet.path=/ # Path of the main dispatcher servlet. server.servlet.session.cookie.comment= # Comment for the session cookie. server.servlet.session.cookie.domain= # Domain for the session cookie. server.servlet.session.cookie.http-only= # "HttpOnly" flag for the session cookie. server.servlet.session.cookie.max-age= # Maximum age of the session cookie. If a duration suffix is not specified, seconds will be used. server.servlet.session.cookie.name= # Session cookie name. server.servlet.session.cookie.path= # Path of the session cookie. server.servlet.session.cookie.secure= # "Secure" flag for the session cookie. server.servlet.session.persistent=false # Whether to persist session data between restarts. server.servlet.session.store-dir= # Directory used to store session data. server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds will be used. server.servlet.session.tracking-modes= # Session tracking modes (one or more of the following: "cookie", "url", "ssl").
6. tomcat
主要是tomcat相关配置,具体参阅org.springframework.boot.autoconfigure.web.ServerProperties.Tomcat
- 使用方式
server.tomcat.uri-encoding=UTF-8
server.tomcat.accept-count=0 # Maximum queue length for incoming connection requests when all possible request processing threads are in use. server.tomcat.accesslog.buffered=true # Whether to buffer output such that it is flushed only periodically. server.tomcat.accesslog.directory=logs # Directory in which log files are created. Can be absolute or relative to the Tomcat base dir. server.tomcat.accesslog.enabled=false # Enable access log. server.tomcat.accesslog.file-date-format=.yyyy-MM-dd # Date format to place in the log file name. server.tomcat.accesslog.pattern=common # Format pattern for access logs. server.tomcat.accesslog.prefix=access_log # Log file name prefix. server.tomcat.accesslog.rename-on-rotate=false # Whether to defer inclusion of the date stamp in the file name until rotate time. server.tomcat.accesslog.request-attributes-enabled=false # Set request attributes for the IP address, Hostname, protocol, and port used for the request. server.tomcat.accesslog.rotate=true # Whether to enable access log rotation. server.tomcat.accesslog.suffix=.log # Log file name suffix. server.tomcat.additional-tld-skip-patterns= # Comma-separated list of additional patterns that match jars to ignore for TLD scanning. server.tomcat.background-processor-delay=30s # Delay between the invocation of backgroundProcess methods. If a duration suffix is not specified, seconds will be used. server.tomcat.basedir= # Tomcat base directory. If not specified, a temporary directory is used. server.tomcat.internal-proxies=10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\ 192\\.168\\.\\d{1,3}\\.\\d{1,3}|\\ 169\\.254\\.\\d{1,3}\\.\\d{1,3}|\\ 127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\ 172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\ 172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\ 172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3} # Regular expression matching trusted IP addresses. server.tomcat.max-connections=0 # Maximum number of connections that the server accepts and processes at any given time. server.tomcat.max-http-header-size=0 # Maximum size, in bytes, of the HTTP message header. server.tomcat.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content. server.tomcat.max-threads=0 # Maximum number of worker threads. server.tomcat.min-spare-threads=0 # Minimum number of worker threads. server.tomcat.port-header=X-Forwarded-Port # Name of the HTTP header used to override the original port value. server.tomcat.protocol-header= # Header that holds the incoming protocol, usually named "X-Forwarded-Proto". server.tomcat.protocol-header-https-value=https # Value of the protocol header indicating whether the incoming request uses SSL. server.tomcat.redirect-context-root= # Whether requests to the context root should be redirected by appending a / to the path. server.tomcat.remote-ip-header= # Name of the HTTP header from which the remote IP is extracted. For instance, `X-FORWARDED-FOR`. server.tomcat.resource.cache-ttl= # Time-to-live of the static resource cache. server.tomcat.uri-encoding=UTF-8 # Character encoding to use to decode the URI. server.tomcat.use-relative-redirects= # Whether HTTP 1.1 and later location headers generated by a call to sendRedirect will use relative or absolute redirects.
7. jetty
也是一款web服务器,这里主要是jetty相关的配置,具体参阅org.springframework.boot.autoconfigure.web.ServerProperties.Jetty
- 使用方式
server.jetty.selectors=1
server.jetty.acceptors= # Number of acceptor threads to use. server.jetty.accesslog.append=false # Append to log. server.jetty.accesslog.date-format=dd/MMM/yyyy:HH:mm:ss Z # Timestamp format of the request log. server.jetty.accesslog.enabled=false # Enable access log. server.jetty.accesslog.extended-format=false # Enable extended NCSA format. server.jetty.accesslog.file-date-format= # Date format to place in log file name. server.jetty.accesslog.filename= # Log filename. If not specified, logs redirect to "System.err". server.jetty.accesslog.locale= # Locale of the request log. server.jetty.accesslog.log-cookies=false # Enable logging of the request cookies. server.jetty.accesslog.log-latency=false # Enable logging of request processing time. server.jetty.accesslog.log-server=false # Enable logging of the request hostname. server.jetty.accesslog.retention-period=31 # Number of days before rotated log files are deleted. server.jetty.accesslog.time-zone=GMT # Timezone of the request log. server.jetty.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post or put content. server.jetty.selectors= # Number of selector threads to use.
8. undertow
是红帽的一款开源web服务器,性能卓越。很多人推荐使用此款服务器。这里主要是undertow相关配置,具体参阅org.springframework.boot.autoconfigure.web.ServerProperties.Undertow
- 使用方式
server.undertow.enabled=false
server.undertow.accesslog.dir= # Undertow access log directory. server.undertow.accesslog.enabled=false # Whether to enable the access log. server.undertow.accesslog.pattern=common # Format pattern for access logs. server.undertow.accesslog.prefix=access_log. # Log file name prefix. server.undertow.accesslog.rotate=true # Whether to enable access log rotation. server.undertow.accesslog.suffix=log # Log file name suffix. server.undertow.buffer-size= # Size of each buffer, in bytes. server.undertow.direct-buffers= # Whether to allocate buffers outside the Java heap. server.undertow.io-threads= # Number of I/O threads to create for the worker. server.undertow.eager-filter-init=true # Whether servlet filters should be initialized on startup. server.undertow.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content. server.undertow.worker-threads= # Number of worker threads.
9. error
错误相关配置
server.error.include-exception=false # Include the "exception" attribute. server.error.include-stacktrace=never # When to include a "stacktrace" attribute. server.error.path=/error # Path of the error controller. server.error.whitelabel.enabled=true # Whether to enable the default error page displayed in browsers in case of a server error.
三大服务器整合使用
这里是接之前的教程,默认已经引入我们的父工程。自己测试的话引入SB提供的parent即可。
tomcat
tomcat服务器的相关配置
- 内置tomcat方式
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- 外置tomcat
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!--排除tomcat依赖--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!--引入servlet支持--> <!--servlet依赖--> <!--httpServletRequest等相关文件--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--引入servlet支持结束-->
- application-tomcat.yml文件
server: tomcat: basedir: D:\work\ricky\tomcat
jetty
jetty相关配置
- 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!--排除tomcat依赖--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!--引入servlet支持--> <!--servlet依赖--> <!--httpServletRequest等相关文件--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--引入servlet支持结束--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
- application-jetty.yml 示例
server: jetty: accesslog: enabled: true date-format: yyyy-MM-dd:HH:mm:ss filename: D:\work\ricky\jetty\access.log
undertow
undertow服务器整合
- 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!--排除tomcat依赖--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!--引入servlet支持--> <!--servlet依赖--> <!--httpServletRequest等相关文件--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--引入servlet支持结束--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
- application-undertow.yml
server: undertow: accesslog: dir: D:\work\ricky\undertow\ prefix: chapter05. suffix: log enabled: true
说明
从启动和响应来看,undertow是最快的,tomcat和jetty相差不大。
附源码
/* * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.boot.autoconfigure.web; import java.io.File; import java.net.InetAddress; import java.nio.charset.Charset; import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.boot.convert.DurationUnit; import org.springframework.boot.web.server.Compression; import org.springframework.boot.web.server.Http2; import org.springframework.boot.web.server.Ssl; import org.springframework.boot.web.servlet.server.Jsp; import org.springframework.boot.web.servlet.server.Session; import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** * {@link ConfigurationProperties} for a web server (e.g. port and path settings). * * @author Dave Syer * @author Stephane Nicoll * @author Andy Wilkinson * @author Ivan Sopov * @author Marcos Barbero * @author Eddú Meléndez * @author Quinten De Swaef * @author Venil Noronha * @author Aurélien Leboulanger * @author Brian Clozel * @author Olivier Lamy */ @ConfigurationProperties(prefix = "server", ignoreUnknownFields = true) public class ServerProperties { /** * Server HTTP port. */ private Integer port; /** * Network address to which the server should bind. */ private InetAddress address; @NestedConfigurationProperty private final ErrorProperties error = new ErrorProperties(); /** * Whether X-Forwarded-* headers should be applied to the HttpRequest. */ private Boolean useForwardHeaders; /** * Value to use for the Server response header (if empty, no header is sent). */ private String serverHeader; /** * Maximum size, in bytes, of the HTTP message header. */ private int maxHttpHeaderSize = 0; // bytes /** * Time that connectors wait for another HTTP request before closing the connection. * When not set, the connector's container-specific default is used. Use a value of -1 * to indicate no (that is, an infinite) timeout. */ private Duration connectionTimeout; @NestedConfigurationProperty private Ssl ssl; @NestedConfigurationProperty private final Compression compression = new Compression(); @NestedConfigurationProperty private final Http2 http2 = new Http2(); private final Servlet servlet = new Servlet(); private final Tomcat tomcat = new Tomcat(); private final Jetty jetty = new Jetty(); private final Undertow undertow = new Undertow(); public Integer getPort() { return this.port; } public void setPort(Integer port) { this.port = port; } public InetAddress getAddress() { return this.address; } public void setAddress(InetAddress address) { this.address = address; } public Boolean isUseForwardHeaders() { return this.useForwardHeaders; } public void setUseForwardHeaders(Boolean useForwardHeaders) { this.useForwardHeaders = useForwardHeaders; } public String getServerHeader() { return this.serverHeader; } public void setServerHeader(String serverHeader) { this.serverHeader = serverHeader; } public int getMaxHttpHeaderSize() { return this.maxHttpHeaderSize; } public void setMaxHttpHeaderSize(int maxHttpHeaderSize) { this.maxHttpHeaderSize = maxHttpHeaderSize; } public Duration getConnectionTimeout() { return this.connectionTimeout; } public void setConnectionTimeout(Duration connectionTimeout) { this.connectionTimeout = connectionTimeout; } public ErrorProperties getError() { return this.error; } public Ssl getSsl() { return this.ssl; } public void setSsl(Ssl ssl) { this.ssl = ssl; } public Compression getCompression() { return this.compression; } public Http2 getHttp2() { return this.http2; } public Servlet getServlet() { return this.servlet; } public Tomcat getTomcat() { return this.tomcat; } public Jetty getJetty() { return this.jetty; } public Undertow getUndertow() { return this.undertow; } /** * Servlet properties. */ public static class Servlet { /** * Servlet context init parameters. */ private final Map<String, String> contextParameters = new HashMap<>(); /** * Context path of the application. */ private String contextPath; /** * Display name of the application. */ private String applicationDisplayName = "application"; /** * Path of the main dispatcher servlet. */ private String path = "/"; @NestedConfigurationProperty private final Jsp jsp = new Jsp(); @NestedConfigurationProperty private final Session session = new Session(); public String getContextPath() { return this.contextPath; } public void setContextPath(String contextPath) { this.contextPath = cleanContextPath(contextPath); } private String cleanContextPath(String contextPath) { if (StringUtils.hasText(contextPath) && contextPath.endsWith("/")) { return contextPath.substring(0, contextPath.length() - 1); } return contextPath; } public String getApplicationDisplayName() { return this.applicationDisplayName; } public void setApplicationDisplayName(String displayName) { this.applicationDisplayName = displayName; } public String getPath() { return this.path; } public void setPath(String path) { Assert.notNull(path, "Path must not be null"); this.path = path; } public Map<String, String> getContextParameters() { return this.contextParameters; } public Jsp getJsp() { return this.jsp; } public Session getSession() { return this.session; } public String getServletMapping() { if (this.path.equals("") || this.path.equals("/")) { return "/"; } if (this.path.contains("*")) { return this.path; } if (this.path.endsWith("/")) { return this.path + "*"; } return this.path + "/*"; } public String getPath(String path) { String prefix = getServletPrefix(); if (!path.startsWith("/")) { path = "/" + path; } return prefix + path; } public String getServletPrefix() { String result = this.path; int index = result.indexOf('*'); if (index != -1) { result = result.substring(0, index); } if (result.endsWith("/")) { result = result.substring(0, result.length() - 1); } return result; } public String[] getPathsArray(Collection<String> paths) { String[] result = new String[paths.size()]; int i = 0; for (String path : paths) { result[i++] = getPath(path); } return result; } public String[] getPathsArray(String[] paths) { String[] result = new String[paths.length]; int i = 0; for (String path : paths) { result[i++] = getPath(path); } return result; } } /** * Tomcat properties. */ public static class Tomcat { /** * Access log configuration. */ private final Accesslog accesslog = new Accesslog(); /** * Regular expression matching trusted IP addresses. */ private String internalProxies = "10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|" // 10/8 + "192\\.168\\.\\d{1,3}\\.\\d{1,3}|" // 192.168/16 + "169\\.254\\.\\d{1,3}\\.\\d{1,3}|" // 169.254/16 + "127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|" // 127/8 + "172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|" // 172.16/12 + "172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|" + "172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}"; /** * Header that holds the incoming protocol, usually named "X-Forwarded-Proto". */ private String protocolHeader; /** * Value of the protocol header indicating whether the incoming request uses SSL. */ private String protocolHeaderHttpsValue = "https"; /** * Name of the HTTP header used to override the original port value. */ private String portHeader = "X-Forwarded-Port"; /** * Name of the HTTP header from which the remote IP is extracted. For instance, * `X-FORWARDED-FOR`. */ private String remoteIpHeader; /** * Tomcat base directory. If not specified, a temporary directory is used. */ private File basedir; /** * Delay between the invocation of backgroundProcess methods. If a duration suffix * is not specified, seconds will be used. */ @DurationUnit(ChronoUnit.SECONDS) private Duration backgroundProcessorDelay = Duration.ofSeconds(30); /** * Maximum number of worker threads. */ private int maxThreads = 0; /** * Minimum number of worker threads. */ private int minSpareThreads = 0; /** * Maximum size, in bytes, of the HTTP post content. */ private int maxHttpPostSize = 0; /** * Maximum size, in bytes, of the HTTP message header. */ private int maxHttpHeaderSize = 0; /** * Whether requests to the context root should be redirected by appending a / to * the path. */ private Boolean redirectContextRoot; /** * Whether HTTP 1.1 and later location headers generated by a call to sendRedirect * will use relative or absolute redirects. */ private Boolean useRelativeRedirects; /** * Character encoding to use to decode the URI. */ private Charset uriEncoding; /** * Maximum number of connections that the server accepts and processes at any * given time. Once the limit has been reached, the operating system may still * accept connections based on the "acceptCount" property. */ private int maxConnections = 0; /** * Maximum queue length for incoming connection requests when all possible request * processing threads are in use. */ private int acceptCount = 0; /** * Comma-separated list of additional patterns that match jars to ignore for TLD * scanning. The special '?' and '*' characters can be used in the pattern to * match one and only one character and zero or more characters respectively. */ private List<String> additionalTldSkipPatterns = new ArrayList<>(); /** * Static resource configuration. */ private final Resource resource = new Resource(); public int getMaxThreads() { return this.maxThreads; } public void setMaxThreads(int maxThreads) { this.maxThreads = maxThreads; } public int getMinSpareThreads() { return this.minSpareThreads; } public void setMinSpareThreads(int minSpareThreads) { this.minSpareThreads = minSpareThreads; } public int getMaxHttpPostSize() { return this.maxHttpPostSize; } public void setMaxHttpPostSize(int maxHttpPostSize) { this.maxHttpPostSize = maxHttpPostSize; } public Accesslog getAccesslog() { return this.accesslog; } public Duration getBackgroundProcessorDelay() { return this.backgroundProcessorDelay; } public void setBackgroundProcessorDelay(Duration backgroundProcessorDelay) { this.backgroundProcessorDelay = backgroundProcessorDelay; } public File getBasedir() { return this.basedir; } public void setBasedir(File basedir) { this.basedir = basedir; } public String getInternalProxies() { return this.internalProxies; } public void setInternalProxies(String internalProxies) { this.internalProxies = internalProxies; } public String getProtocolHeader() { return this.protocolHeader; } public void setProtocolHeader(String protocolHeader) { this.protocolHeader = protocolHeader; } public String getProtocolHeaderHttpsValue() { return this.protocolHeaderHttpsValue; } public void setProtocolHeaderHttpsValue(String protocolHeaderHttpsValue) { this.protocolHeaderHttpsValue = protocolHeaderHttpsValue; } public String getPortHeader() { return this.portHeader; } public void setPortHeader(String portHeader) { this.portHeader = portHeader; } public Boolean getRedirectContextRoot() { return this.redirectContextRoot; } public void setRedirectContextRoot(Boolean redirectContextRoot) { this.redirectContextRoot = redirectContextRoot; } public Boolean getUseRelativeRedirects() { return this.useRelativeRedirects; } public void setUseRelativeRedirects(Boolean useRelativeRedirects) { this.useRelativeRedirects = useRelativeRedirects; } public String getRemoteIpHeader() { return this.remoteIpHeader; } public void setRemoteIpHeader(String remoteIpHeader) { this.remoteIpHeader = remoteIpHeader; } public Charset getUriEncoding() { return this.uriEncoding; } public void setUriEncoding(Charset uriEncoding) { this.uriEncoding = uriEncoding; } public int getMaxConnections() { return this.maxConnections; } public void setMaxConnections(int maxConnections) { this.maxConnections = maxConnections; } public int getMaxHttpHeaderSize() { return this.maxHttpHeaderSize; } public void setMaxHttpHeaderSize(int maxHttpHeaderSize) { this.maxHttpHeaderSize = maxHttpHeaderSize; } public int getAcceptCount() { return this.acceptCount; } public void setAcceptCount(int acceptCount) { this.acceptCount = acceptCount; } public List<String> getAdditionalTldSkipPatterns() { return this.additionalTldSkipPatterns; } public void setAdditionalTldSkipPatterns(List<String> additionalTldSkipPatterns) { this.additionalTldSkipPatterns = additionalTldSkipPatterns; } public Resource getResource() { return this.resource; } /** * Tomcat access log properties. */ public static class Accesslog { /** * Enable access log. */ private boolean enabled = false; /** * Format pattern for access logs. */ private String pattern = "common"; /** * Directory in which log files are created. Can be absolute or relative to * the Tomcat base dir. */ private String directory = "logs"; /** * Log file name prefix. */ protected String prefix = "access_log"; /** * Log file name suffix. */ private String suffix = ".log"; /** * Whether to enable access log rotation. */ private boolean rotate = true; /** * Whether to defer inclusion of the date stamp in the file name until rotate * time. */ private boolean renameOnRotate; /** * Date format to place in the log file name. */ private String fileDateFormat = ".yyyy-MM-dd"; /** * Set request attributes for the IP address, Hostname, protocol, and port * used for the request. */ private boolean requestAttributesEnabled; /** * Whether to buffer output such that it is flushed only periodically. */ private boolean buffered = true; public boolean isEnabled() { return this.enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public String getPattern() { return this.pattern; } public void setPattern(String pattern) { this.pattern = pattern; } public String getDirectory() { return this.directory; } public void setDirectory(String directory) { this.directory = directory; } public String getPrefix() { return this.prefix; } public void setPrefix(String prefix) { this.prefix = prefix; } public String getSuffix() { return this.suffix; } public void setSuffix(String suffix) { this.suffix = suffix; } public boolean isRotate() { return this.rotate; } public void setRotate(boolean rotate) { this.rotate = rotate; } public boolean isRenameOnRotate() { return this.renameOnRotate; } public void setRenameOnRotate(boolean renameOnRotate) { this.renameOnRotate = renameOnRotate; } public String getFileDateFormat() { return this.fileDateFormat; } public void setFileDateFormat(String fileDateFormat) { this.fileDateFormat = fileDateFormat; } public boolean isRequestAttributesEnabled() { return this.requestAttributesEnabled; } public void setRequestAttributesEnabled(boolean requestAttributesEnabled) { this.requestAttributesEnabled = requestAttributesEnabled; } public boolean isBuffered() { return this.buffered; } public void setBuffered(boolean buffered) { this.buffered = buffered; } } /** * Tomcat static resource properties. */ public static class Resource { /** * Time-to-live of the static resource cache. */ private Duration cacheTtl; public Duration getCacheTtl() { return this.cacheTtl; } public void setCacheTtl(Duration cacheTtl) { this.cacheTtl = cacheTtl; } } } /** * Jetty properties. */ public static class Jetty { /** * Access log configuration. */ private final Accesslog accesslog = new Accesslog(); /** * Maximum size, in bytes, of the HTTP post or put content. */ private int maxHttpPostSize = 0; // bytes /** * Number of acceptor threads to use. */ private Integer acceptors; /** * Number of selector threads to use. */ private Integer selectors; public Accesslog getAccesslog() { return this.accesslog; } public int getMaxHttpPostSize() { return this.maxHttpPostSize; } public void setMaxHttpPostSize(int maxHttpPostSize) { this.maxHttpPostSize = maxHttpPostSize; } public Integer getAcceptors() { return this.acceptors; } public void setAcceptors(Integer acceptors) { this.acceptors = acceptors; } public Integer getSelectors() { return this.selectors; } public void setSelectors(Integer selectors) { this.selectors = selectors; } /** * Jetty access log properties. */ public static class Accesslog { /** * Enable access log. */ private boolean enabled = false; /** * Log filename. If not specified, logs redirect to "System.err". */ private String filename; /** * Date format to place in log file name. */ private String fileDateFormat; /** * Number of days before rotated log files are deleted. */ private int retentionPeriod = 31; // no days /** * Append to log. */ private boolean append; /** * Enable extended NCSA format. */ private boolean extendedFormat; /** * Timestamp format of the request log. */ private String dateFormat = "dd/MMM/yyyy:HH:mm:ss Z"; /** * Locale of the request log. */ private Locale locale; /** * Timezone of the request log. */ private TimeZone timeZone = TimeZone.getTimeZone("GMT"); /** * Enable logging of the request cookies. */ private boolean logCookies; /** * Enable logging of the request hostname. */ private boolean logServer; /** * Enable logging of request processing time. */ private boolean logLatency; public boolean isEnabled() { return this.enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public String getFilename() { return this.filename; } public void setFilename(String filename) { this.filename = filename; } public String getFileDateFormat() { return this.fileDateFormat; } public void setFileDateFormat(String fileDateFormat) { this.fileDateFormat = fileDateFormat; } public int getRetentionPeriod() { return this.retentionPeriod; } public void setRetentionPeriod(int retentionPeriod) { this.retentionPeriod = retentionPeriod; } public boolean isAppend() { return this.append; } public void setAppend(boolean append) { this.append = append; } public boolean isExtendedFormat() { return this.extendedFormat; } public void setExtendedFormat(boolean extendedFormat) { this.extendedFormat = extendedFormat; } public String getDateFormat() { return this.dateFormat; } public void setDateFormat(String dateFormat) { this.dateFormat = dateFormat; } public Locale getLocale() { return this.locale; } public void setLocale(Locale locale) { this.locale = locale; } public TimeZone getTimeZone() { return this.timeZone; } public void setTimeZone(TimeZone timeZone) { this.timeZone = timeZone; } public boolean isLogCookies() { return this.logCookies; } public void setLogCookies(boolean logCookies) { this.logCookies = logCookies; } public boolean isLogServer() { return this.logServer; } public void setLogServer(boolean logServer) { this.logServer = logServer; } public boolean isLogLatency() { return this.logLatency; } public void setLogLatency(boolean logLatency) { this.logLatency = logLatency; } } } /** * Undertow properties. */ public static class Undertow { /** * Maximum size, in bytes, of the HTTP post content. */ private long maxHttpPostSize = 0; // bytes /** * Size of each buffer, in bytes. */ private Integer bufferSize; /** * Number of I/O threads to create for the worker. */ private Integer ioThreads; /** * Number of worker threads. */ private Integer workerThreads; /** * Whether to allocate buffers outside the Java heap. */ private Boolean directBuffers; /** * Whether servlet filters should be initialized on startup. */ private boolean eagerFilterInit = true; private final Accesslog accesslog = new Accesslog(); public long getMaxHttpPostSize() { return this.maxHttpPostSize; } public void setMaxHttpPostSize(long maxHttpPostSize) { this.maxHttpPostSize = maxHttpPostSize; } public Integer getBufferSize() { return this.bufferSize; } public void setBufferSize(Integer bufferSize) { this.bufferSize = bufferSize; } public Integer getIoThreads() { return this.ioThreads; } public void setIoThreads(Integer ioThreads) { this.ioThreads = ioThreads; } public Integer getWorkerThreads() { return this.workerThreads; } public void setWorkerThreads(Integer workerThreads) { this.workerThreads = workerThreads; } public Boolean getDirectBuffers() { return this.directBuffers; } public void setDirectBuffers(Boolean directBuffers) { this.directBuffers = directBuffers; } public boolean isEagerFilterInit() { return this.eagerFilterInit; } public void setEagerFilterInit(boolean eagerFilterInit) { this.eagerFilterInit = eagerFilterInit; } public Accesslog getAccesslog() { return this.accesslog; } /** * Undertow access log properties. */ public static class Accesslog { /** * Whether to enable the access log. */ private boolean enabled = false; /** * Format pattern for access logs. */ private String pattern = "common"; /** * Log file name prefix. */ protected String prefix = "access_log."; /** * Log file name suffix. */ private String suffix = "log"; /** * Undertow access log directory. */ private File dir = new File("logs"); /** * Whether to enable access log rotation. */ private boolean rotate = true; public boolean isEnabled() { return this.enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public String getPattern() { return this.pattern; } public void setPattern(String pattern) { this.pattern = pattern; } public String getPrefix() { return this.prefix; } public void setPrefix(String prefix) { this.prefix = prefix; } public String getSuffix() { return this.suffix; } public void setSuffix(String suffix) { this.suffix = suffix; } public File getDir() { return this.dir; } public void setDir(File dir) { this.dir = dir; } public boolean isRotate() { return this.rotate; } public void setRotate(boolean rotate) { this.rotate = rotate; } } } }
- @ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
表示配置属性是server开头 忽略不知道的属性
演示项目地址,欢迎fork和star
最后
-
作者ricky
-
交流群:244930845