SpringBoot 2.0 系列007

Stella981
• 阅读 866

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方式
org.springframework.boot spring-boot-starter-web
  • 外置tomcat
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat javax.servlet javax.servlet-api 3.1.0 provided
  • application-tomcat.yml文件

server: tomcat: basedir: D:\work\ricky\tomcat

jetty

jetty相关配置

  • 依赖
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat javax.servlet javax.servlet-api 3.1.0 provided
    <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服务器整合

  • 依赖
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat javax.servlet javax.servlet-api 3.1.0 provided
    <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

最后

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))
容器化部署一套云服务系列1\.容器化部署一套云服务之Jenkins(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fjackson0714%2Fp%2Fdeploy1.html)一、购买服务器服务器!caeef00
Stella981 Stella981
3年前
SpringBoot 2.0 系列004
SpringBoot2.0系列004启动实战之配置文件配置文件配置文件加载流程很多文档包括官方文档说SB的默认配置文件是application开头的文件,那么是为什么呢?我们先看下流程图 !(https://gitee.c
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这