SpringBoot 2.0 系列007 --WEB容器详解


声明:本文转载自https://my.oschina.net/lt0314/blog/1816764,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

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

码云:SpringBootLearn

最后

本文发表于2018年05月22日 22:00
(c)注:本文转载自https://my.oschina.net/lt0314/blog/1816764,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 3190 讨论 1 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1