Jetty - Embedded Servlet Container Configuration

1
2
3
4
5
<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-webapp-jetty</artifactId>
    <version>${cas.version}</version>
</dependency>
1
implementation "org.apereo.cas:cas-server-webapp-jetty:${project.'cas.version'}"
1
2
3
4
5
6
7
8
9
dependencyManagement {
    imports {
        mavenBom "org.apereo.cas:cas-server-support-bom:${project.'cas.version'}"
    }
}

dependencies {
    implementation "org.apereo.cas:cas-server-webapp-jetty"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
dependencies {
    /*
        The following platform references are included automatically and are listed for reference only.

        implementation enforcedPlatform("org.apereo.cas:cas-server-support-bom:${project.'cas.version'}")
        implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
        
        Including this module in the CAS WAR overlay is optional and unnecessary. This module is automatically included
        and bundled with the CAS server distribution and there are alternative options baked in to allow one to replace
        this module with another. The entry below is listed for reference only.
    */
    implementation "org.apereo.cas:cas-server-webapp-jetty"
}

Embedded Jetty Container

The following settings and properties are available from the CAS configuration catalog:

cas.server.jetty.sni-host-checkServer Name Indication is an extension of the Transport Layer Security (TLS) protocol, which allows a client to indicate which hostname it is attempting to connect to at the start of the handshaking process.
true

Server Name Indication is an extension of the Transport Layer Security (TLS) protocol, which allows a client to indicate which hostname it is attempting to connect to at the start of the handshaking process. This is particularly useful when a server hosts multiple domains with different SSL certificates on a single IP address. Setting this setting to false would mean that the Jetty server will not strictly require clients to send an SNI extension during the SSL/TLS handshake and disables host name checking for Server Name Indication (SNI) during SSL/TLS handshakes.

Type
Boolean
Default
true
Defined by
CasEmbeddedJettyProperties
server.jetty.accesslog.appendAppend to log.
false
Third party

Append to log.

Type
Boolean
Default
false
Defined by
JettyServerProperties$Accesslog
server.jetty.accesslog.custom-formatCustom log format, see org.eclipse.jetty.server.CustomRequestLog.
no default
Third party

Custom log format, see org.eclipse.jetty.server.CustomRequestLog. If defined, overrides the "format" configuration key.

Type
String
Default
none
Defined by
JettyServerProperties$Accesslog
server.jetty.accesslog.date-format
no default
Third partyDeprecated
Default
none
Deprecation
ERROR, replaced by server.jetty.accesslog.custom-format
server.jetty.accesslog.enabledEnable access log.
false
Third party

Enable access log.

Type
Boolean
Default
false
Defined by
JettyServerProperties$Accesslog
server.jetty.accesslog.extended-format
no default
Third partyDeprecated
Default
none
Deprecation
ERROR, replaced by server.jetty.accesslog.format
server.jetty.accesslog.file-date-formatDate format to place in log file name.
no default
Third party

Date format to place in log file name.

Type
String
Default
none
Defined by
JettyServerProperties$Accesslog
server.jetty.accesslog.filenameLog filename.
no default
Third party

Log filename. If not specified, logs redirect to "System.err".

Type
String
Default
none
Defined by
JettyServerProperties$Accesslog
server.jetty.accesslog.formatLog format.
no default
Third party

Log format.

Type
JettyServerProperties.Accesslog.Format
Default
none
Defined by
JettyServerProperties$Accesslog
server.jetty.accesslog.ignore-pathsRequest paths that should not be logged.
no default
Third party

Request paths that should not be logged.

Type
List<String>
Default
none
Defined by
JettyServerProperties$Accesslog
server.jetty.accesslog.locale
no default
Third partyDeprecated
Default
none
Deprecation
ERROR, replaced by server.jetty.accesslog.custom-format
server.jetty.accesslog.log-cookies
no default
Third partyDeprecated
Default
none
Deprecation
ERROR, replaced by server.jetty.accesslog.custom-format
server.jetty.accesslog.log-latency
no default
Third partyDeprecated
Default
none
Deprecation
ERROR, replaced by server.jetty.accesslog.custom-format
server.jetty.accesslog.log-server
no default
Third partyDeprecated
Default
none
Deprecation
ERROR, replaced by server.jetty.accesslog.custom-format
server.jetty.accesslog.retention-periodNumber of days before rotated log files are deleted.
31
Third party

Number of days before rotated log files are deleted.

Type
Integer
Default
31
Defined by
JettyServerProperties$Accesslog
server.jetty.accesslog.time-zone
no default
Third partyDeprecated
Default
none
Deprecation
ERROR, replaced by server.jetty.accesslog.custom-format
server.jetty.connection-idle-timeoutTime that the connection can be idle before it is closed.
no default
Third party

Time that the connection can be idle before it is closed.

Type
Duration
Default
none
Defined by
JettyServerProperties
server.jetty.forwarded-headers.header-formatFormat of the forwarded headers to support.
x-forwarded
Third party

Format of the forwarded headers to support.

Type
JettyServerProperties.Forwardedheaders.HeaderFormat
Default
x-forwarded
Defined by
JettyServerProperties$Forwardedheaders
server.jetty.max-connectionsMaximum number of connections that the server accepts and processes at any given time.
-1
Third party

Maximum number of connections that the server accepts and processes at any given time.

Type
Integer
Default
-1
Defined by
JettyServerProperties
server.jetty.max-form-keysMaximum number of form keys.
1000
Third party

Maximum number of form keys.

Type
Integer
Default
1000
Defined by
JettyServerProperties
server.jetty.max-http-form-post-sizeMaximum size of the form content in any HTTP post request.
200000B
Third party

Maximum size of the form content in any HTTP post request.

Type
DataSize
Default
200000B
Defined by
JettyServerProperties
server.jetty.max-http-post-size
no default
Third partyDeprecated
Type
DataSize
Default
none
Deprecation
ERROR, replaced by server.jetty.max-http-form-post-size
server.jetty.max-http-response-header-sizeMaximum size of the HTTP response header.
16KB
Third party

Maximum size of the HTTP response header.

Type
DataSize
Default
16KB
Defined by
JettyServerProperties
server.jetty.threads.acceptorsNumber of acceptor threads to use.
-1
Third party

Number of acceptor threads to use. When the value is -1, the default, the number of acceptors is derived from the operating environment.

Type
Integer
Default
-1
Defined by
JettyServerProperties$Threads
server.jetty.threads.idle-timeoutMaximum thread idle time.
60000ms
Third party

Maximum thread idle time.

Type
Duration
Default
60000ms
Defined by
JettyServerProperties$Threads
server.jetty.threads.maxMaximum number of threads.
200
Third party

Maximum number of threads.

Type
Integer
Default
200
Defined by
JettyServerProperties$Threads
server.jetty.threads.max-queue-capacityMaximum capacity of the thread pool's backing queue.
no default
Third party

Maximum capacity of the thread pool's backing queue. A default is computed based on the threading configuration.

Type
Integer
Default
none
Defined by
JettyServerProperties$Threads
server.jetty.threads.minMinimum number of threads.
8
Third party

Minimum number of threads. Doesn't have an effect if virtual threads are enabled.

Type
Integer
Default
8
Defined by
JettyServerProperties$Threads
server.jetty.threads.selectorsNumber of selector threads to use.
-1
Third party

Number of selector threads to use. When the value is -1, the default, the number of selectors is derived from the operating environment.

Type
Integer
Default
-1
Defined by
JettyServerProperties$Threads

Required settings may be needed to activate or affect the feature; review them even when they have a default. Optional settings only need to be set to change a default or to turn on the behavior they control. Third party settings belong to libraries such as Spring Boot that CAS builds on; their own documentation may have more detail.

Notes on configuration

Configuration Metadata

The collection of configuration properties listed in this section are automatically generated from the CAS source and components that contain the actual field definitions, types, descriptions, modules, etc. This metadata may not always be 100% accurate, or could be lacking details and sufficient explanations.

Be Selective

This section is meant as a guide only. Do NOT copy/paste the entire collection of settings into your CAS configuration; rather pick only the properties that you need. Do NOT enable settings unless you are certain of their purpose and do NOT copy settings into your configuration only to keep them as reference. All these ideas lead to upgrade headaches, maintenance nightmares and premature aging.

YAGNI

Note that for nearly ALL use cases, declaring and configuring properties listed here is sufficient. You should NOT have to explicitly massage a CAS XML/Java/etc configuration file to design an authentication handler, create attribute release policies, etc. CAS at runtime will auto-configure all required changes for you. If you are unsure about the meaning of a given CAS setting, do NOT turn it on without hesitation. Review the codebase or better yet, ask questions to clarify the intended behavior.

Naming Convention

Property names can be specified in very relaxed terms. For instance cas.someProperty, cas.some-property, cas.some_property are all valid names. While all forms are accepted by CAS, there are certain components (in CAS and other frameworks used) whose activation at runtime is conditional on a property value, where this property is required to have been specified in CAS configuration using kebab case. This is both true for properties that are owned by CAS as well as those that might be presented to the system via an external library or framework such as Spring Boot, etc.

:information_source: Note

When possible, properties should be stored in lower-case kebab format, such as cas.property-name=value. The only possible exception to this rule is when naming actuator endpoints; The name of the actuator endpoints (i.e. ssoSessions) MUST remain in camelCase mode.

Settings and properties that are controlled by the CAS platform directly always begin with the prefix cas. All other settings are controlled and provided to CAS via other underlying frameworks and may have their own schemas and syntax. BE CAREFUL with the distinction. Unrecognized properties are rejected by CAS and/or frameworks upon which CAS depends. This means if you somehow misspell a property definition or fail to adhere to the dot-notation syntax and such, your setting is entirely refused by CAS and likely the feature it controls will never be activated in the way you intend.

Validation

Configuration properties are automatically validated on CAS startup to report issues with configuration binding, especially if defined CAS settings cannot be recognized or validated by the configuration schema. Additional validation processes are also handled via Configuration Metadata and property migrations applied automatically on startup by Spring Boot and family.

Indexed Settings

CAS settings able to accept multiple values are typically documented with an index, such as cas.some.setting[0]=value. The index [0] is meant to be incremented by the adopter to allow for distinct multiple configuration blocks.