Context 容器

目录

简介

以下描述使用变量名 $CATALINA_BASE 指代大多数相对路径所解析的基本目录。如果您尚未通过设置 CATALINA_BASE 目录来为 Tomcat 配置多个实例,那么 $CATALINA_BASE 将被设置为 $CATALINA_HOME 的值,即您安装 Tomcat 的目录。

Context 元素表示一个在特定虚拟主机中运行的 Web 应用程序。每个 Web 应用程序都基于一个 Web 应用程序归档 (WAR) 文件,或者一个包含相应解压内容的目录,如 Servlet 规范(2.2 版或更高)中所述。有关 Web 应用程序归档的更多信息,您可以下载 Servlet 规范,并查阅 Tomcat 应用程序开发者指南

用于处理每个 HTTP 请求的 Web 应用程序由 Catalina 根据请求 URI 与每个已定义 Context 的 context path 最长可能前缀的匹配来选择。一旦选中,该 Context 将根据 Web 应用程序部署定义的 servlet 映射,选择适当的 servlet 来处理传入的请求。

您可以定义任意数量的 Context 元素。每个此类 Context 在虚拟主机中必须具有唯一的 context 名称。context path 不必是唯一的(请参阅下面的并行部署)。此外,必须存在一个 context path 等于零长度字符串的 Context。此 Context 将成为该虚拟主机的默认 Web 应用程序,并用于处理所有不匹配任何其他 Context 的 context path 的请求。

并行部署

您可以同时部署具有相同 context path 的多个版本的 Web 应用程序。用于将请求与 context 版本匹配的规则如下:

  • 如果请求中没有会话信息,则使用最新版本。
  • 如果请求中存在会话信息,则检查每个版本的会话管理器中是否存在匹配的会话,如果找到,则使用该版本。
  • 如果请求中存在会话信息但找不到匹配的会话,则使用最新版本。

Host 可以配置(通过 undeployOldVersions)在旧版本不再使用时将其删除。

命名

当 Host 执行 autoDeploydeployOnStartup 操作时,Web 应用程序的名称和 context path 是从定义该 Web 应用程序的文件名中派生的。因此,context path 可能不能在嵌入在应用程序中的 META-INF/context.xml 中定义,并且context 名称context pathcontext 版本以及文件的基本文件名(减去任何 .war.xml 扩展名后的名称)之间存在密切关系。

如果未指定版本,则context 名称始终与context path相同。如果context path为空字符串,则基本名称将为 ROOT(始终大写),否则基本名称将是去除了开头的 '/' 且所有剩余的 '/' 字符替换为 '#' 的context path

如果指定了版本,则context path保持不变,并且context 名称基本名称后都会附加字符串 '##',然后是版本标识符。

这些命名约定的一些示例如下所示。

Context 路径 Context 版本 Context 名称 基本文件名 示例文件名 (.xml, .war & 目录)
/foo /foo foo foo.xml, foo.war, foo
/foo/bar /foo/bar foo#bar foo#bar.xml, foo#bar.war, foo#bar
空字符串 空字符串 ROOT ROOT.xml, ROOT.war, ROOT
/foo 42 /foo##42 foo##42 foo##42.xml, foo##42.war, foo##42
/foo/bar 42 /foo/bar##42 foo#bar##42 foo#bar##42.xml, foo#bar##42.war, foo#bar##42
空字符串 42 ##42 ROOT##42 ROOT##42.xml, ROOT##42.war, ROOT##42

版本组件被视为一个 String,既是为了性能原因,也是为了允许版本方案的灵活性。字符串比较用于确定版本顺序。如果未指定版本,则将其视为空字符串。因此,foo.war 将被视为比 foo##11.war 更早的版本,而 foo##11.war 将被视为比 foo##2.war 更早的版本。如果使用纯数字版本方案,建议使用零填充,以便 foo##002.war 被视为比 foo##011.war 更早的版本。

要在 servlet 中获取当前 Web 应用程序的版本号,您应该使用 org.apache.catalina.webappVersion 属性,如下所示:String webappVersion = (String)request.getServletContext().getAttribute("org.apache.catalina.webappVersion");

如果您想使用与基本文件名无关的 context path 部署 WAR 文件或目录,则必须使用以下选项之一来防止重复部署:

  • 禁用 autoDeploy 和 deployOnStartup,并在 server.xml 中定义所有 Context
  • 将 WAR 和/或目录放置在 Host 的 appBase 之外,并使用带有 docBase 属性的 context.xml 文件来定义它。

定义 Context

不建议将 <Context> 元素直接放置在 server.xml 文件中。这是因为这样做会使修改 Context 配置更具侵入性,主 conf/server.xml 文件无法在不重启 Tomcat 的情况下重新加载。默认的 Context 元素(见下文)也将覆盖直接放置在 server.xml 中的任何 <Context> 元素的配置。为防止这种情况,应将 server.xml 中定义的 <Context> 元素的 override 属性设置为 true

单个 Context 元素可以显式定义在:

  • 在应用程序文件内部的 /META-INF/context.xml 中的单独文件中。可选地(基于 Host 的 copyXML 属性),这可以复制到 $CATALINA_BASE/conf/[enginename]/[hostname]/ 并重命名为应用程序的基本文件名加上“.xml”扩展名。
  • $CATALINA_BASE/conf/[enginename]/[hostname]/ 目录中的单独文件(带有“.xml”扩展名)中。context path 和版本将从文件的基本名称(不含 .xml 扩展名的文件名)中派生。此文件将始终优先于打包在 Web 应用程序 META-INF 目录中的任何 context.xml 文件。
  • 在主 conf/server.xml 文件中的 Host 元素内部。

可以定义适用于多个 Web 应用程序的默认 Context 元素。单个 Web 应用程序的配置将覆盖这些默认配置中的任何内容。在默认 Context 中定义的任何嵌套元素(例如 <Resource> 元素)将为每个适用默认设置的 Context 创建一次。它们不会Context 元素之间共享。

  • $CATALINA_BASE/conf/context.xml 文件中:Context 元素信息将由所有 Web 应用程序加载。
  • $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default 文件中:Context 元素信息将由该 Host 的所有 Web 应用程序加载。

除了 server.xml 之外,定义 Context 元素的文件只能定义一个 Context 元素。

除了显式指定的 Context 元素之外,还可以通过多种技术自动为您创建 Context 元素。有关更多信息,请参阅自动应用程序部署用户 Web 应用程序

要定义使用单个 WAR 文件或目录的多个 Context,请使用上面命名部分中描述的选项之一,以创建具有与基本文件名无关的路径的 Context

属性

通用属性

所有 Context 实现都支持以下属性:

属性描述
allowCasualMultipartParsing

如果 Tomcat 在调用 HttpServletRequest.getPart* 或 HttpServletRequest.getParameter* 时应该自动解析 multipart/form-data 请求体,即使目标 servlet 未使用 @MultipartConfig 注解标记(有关详细信息,请参阅 Servlet 规范 3.0,第 3.2 节),则设置为 true。请注意,除 false 之外的任何设置都会导致 Tomcat 的行为在技术上不符合规范。默认值为 false

allowMultipleLeadingForwardSlashInPath

Tomcat 会将 URI 中多个 / 字符序列规范化为单个 /。这是为了与文件系统行为保持一致,因为 URI 通常会转换为文件系统路径。因此,对于某些 URI,HttpServletRequest#getContextPath() 的返回值预计会以多个 / 字符开头。如果此值直接与 HttpServletResponse#sendRedirect() 一起使用,这将导致问题,因为以 // 开头的重定向路径被视为协议相对重定向。为避免潜在问题,Tomcat 会将 HttpServletRequest#getContextPath() 返回值开头的多个 / 字符折叠为单个 /。此属性的默认值为 false,这会启用多个 / 字符的折叠。要禁用此行为,请将此属性设置为 true

altDDName

此 context 的替代部署描述符的绝对路径。这会覆盖位于 /WEB-INF/web.xml 的默认部署描述符。

alwaysAccessSession

如果此值为 true,则每个与会话关联的请求都将导致会话的上次访问时间更新,无论请求是否显式访问会话。

如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 设置为 true,则此设置的默认值将为 true,否则默认值将为 false

backgroundProcessorDelay

此值表示在此 context 及其子容器(包括所有包装器)上调用 backgroundProcess 方法之间的延迟(秒)。如果子容器的延迟值不为负(这意味着它们正在使用自己的处理线程),则不会调用它们。将其设置为正值将导致生成一个线程。在等待指定时间后,该线程将在此 Host 及其所有子容器上调用 backgroundProcess 方法。Context 将使用后台处理来执行会话过期和类监视以进行重新加载。如果未指定,此属性的默认值为 -1,这意味着 context 将依赖于其父 Host 的后台处理线程。

className

要使用的实现的 Java 类名。此G类必须实现 org.apache.catalina.Context 接口。如果未指定,将使用标准值(定义如下)。

containerSciFilter

用于指定应过滤掉哪些容器提供的 SCI 且不在此 context 中使用的正则表达式。匹配使用 java.util.regex.Matcher.find(),因此正则表达式只需匹配容器提供的 SCI 的完全限定类名的子字符串即可将其过滤掉。如果未指定,将不应用任何过滤。

contextGetResourceRequiresSlash

如果此值为 true,则传递给 ServletContext.getResource()ServletContext.getResourceAsStream() 的路径必须以“/”开头。如果为 false,则像 getResource("myfolder/myresource.txt") 这样的代码将起作用,因为 Tomcat 会在提供的路径前加上“/”。

如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 设置为 true,则此设置的默认值将为 true,否则默认值将为 false

cookies

如果客户端支持使用 Cookie 进行会话标识符通信(这是默认值),则设置为 true。如果您想禁用使用 Cookie 进行会话标识符通信,并仅依赖于应用程序的 URL 重写,则设置为 false

createUploadTargets

如果 Tomcat 应该尝试为 Servlet 创建 MultipartConfig 中指定的临时上传位置(如果该位置尚不存在),则设置为 true。如果未指定,将使用默认值 false

crossContext

如果希望此应用程序内对 ServletContext.getContext() 的调用成功返回在此虚拟主机上运行的其他 Web 应用程序的请求调度器,则设置为 true。在注重安全的环境中,设置为 false(默认值),以使 getContext() 始终返回 null

dispatcherWrapsSameObject

如果此值为 true,则任何传递给应用程序调度器的包装请求或响应对象都将被检查,以确保它已包装原始请求或响应。

如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 设置为 true,则此设置的默认值将为 true,否则默认值将为 false

dispatchersUseEncodedPaths

控制获取请求调度器调用中使用的路径是否期望被编码。这会影响 Tomcat 如何处理获取请求调度器的调用,以及 Tomcat 如何在内部生成用于获取请求调度器的路径。如果未指定,将使用默认值 true。当编码/解码请求调度器的路径时,始终使用 UTF-8。

docBase

此 Web 应用程序的文档基准(也称为上下文根目录)目录,或 Web 应用程序归档文件的路径名(如果此 Web 应用程序直接从 WAR 文件执行)。您可以为该目录或 WAR 文件指定绝对路径名,或指定相对于所属 HostappBase 目录的路径名。

除非 Context 元素在 server.xml 中定义,或 docBase 不位于 HostappBase 下,否则不得设置此字段的值。

如果 docBase 使用符号链接,则对符号链接的更改仅在 Tomcat 重启或通过取消部署并重新部署 context 后才生效。context 重新加载不足以生效。

encodedReverseSolidusHandling

设置为 reject 时,尝试为包含 %5c 序列的路径获取 RequestDispatcher 将触发 IllegalArgumentException。设置为 decode 时,在创建 RequestDispatcher 之前,用于获取 RequestDispatcher 的路径中任何 %5c 序列都将解码为 \(然后规范化为 /)。设置为 passthrough 时,用于获取 RequestDispatcher 的路径中任何 %5c 序列将保持不变。

如果使用 passthrough,则应用程序负责执行任何进一步所需的 %nn 解码。路径中的任何 %25 序列(编码的 %)也将以 %25 序列不变的方式处理,以避免在路径随后被应用程序 %nn 解码时可能发生的数据损坏和/或解码失败。

如果未指定,默认值为 decode

encodedSolidusHandling

设置为 reject 时,尝试为包含 %2f 序列的路径获取 RequestDispatcher 将触发 IllegalArgumentException。设置为 decode 时,在创建 RequestDispatcher 之前,用于获取 RequestDispatcher 的路径中任何 %2f 序列都将解码为 /。设置为 passthrough 时,用于获取 RequestDispatcher 的路径中任何 %2f 序列将保持不变。

如果使用 passthrough,则应用程序负责执行任何进一步所需的 %nn 解码。路径中的任何 %25 序列(编码的 %)也将以 %25 序列不变的方式处理,以避免在路径随后被应用程序 %nn 解码时可能发生的数据损坏和/或解码失败。

如果未指定,默认值为 decode。此默认值将在 Tomcat 12 中更改为 reject(与 Connector 对齐)。

failCtxIfServletStartFails

如果任何 load-on-startup >=0 的 servlet 启动失败,则设置为 true 以使 context 启动失败。

如果未指定,如果父 Host 配置中指定了同名属性,则使用其值。否则,将使用默认值 false

fireRequestListenersOnForwards

设置为 true,以便在 Tomcat 转发请求时触发任何配置的 ServletRequestListeners。这主要用于使用 ServletRequestListeners 配置请求所需环境的 CDI 框架用户。如果未指定,则使用默认值 false

ignoreAnnotations

设置为 true,以使 Tomcat 忽略类上存在的所有注解。

如果未指定,将使用默认值 false

logEffectiveWebXml

如果希望 Web 应用程序使用的有效 web.xml 在应用程序启动时被记录(INFO 级别),则设置为 true。有效的 web.xml 是应用程序的 web.xml 与 Tomcat 配置的任何默认值以及发现的任何 web-fragment.xml 文件和注解相结合的结果。如果未指定,将使用默认值 false

mapperContextRootRedirectEnabled

如果启用,Web 应用程序 context root 的请求将由 Mapper(而非默认 Servlet)在必要时进行重定向(添加尾部斜杠)。这更高效,但存在安全副作用。首先,即使用户无权访问该目录,Web 应用程序或目录的存在也可能被确认。其次,任何 Valve 和/或 Filter(包括提供安全功能的那些)将没有机会处理请求。如果未指定,将使用默认值 true

mapperDirectoryRedirectEnabled

如果启用,Web 应用程序目录的请求将由 Mapper(而非默认 Servlet)在必要时进行重定向(添加尾部斜杠)。这更高效,但存在安全副作用。首先,即使用户无权访问该目录,Web 应用程序或目录的存在也可能被确认。其次,任何 Valve 和/或 Filter(包括提供安全功能的那些)将没有机会处理请求。如果未指定,将使用默认值 false

override

设置为 true 以忽略全局或 Host 默认 context 中的任何设置。默认情况下,将使用默认 context 的设置,但可以通过为 Context 显式设置相同属性来覆盖。

parallelAnnotationScanning

设置为 true 时,注解扫描将使用工具执行器进行。这将允许并行处理扫描,这可能会提高部署类型,但会牺牲更高的服务器负载。如果未指定,将使用默认值 false

path

此 Web 应用程序的context path,它与每个请求 URI 的开头匹配,以选择合适的 Web 应用程序进行处理。特定 Host 内的所有 context path 都必须是唯一的。如果您指定一个空字符串 (“”) 作为 context path,则表示您正在定义此 Host 的默认 Web 应用程序,它将处理所有未分配给其他 Context 的请求。

此属性只能在 server.xml 中静态定义 Context 时使用。在所有其他情况下,路径将从用于 .xml context 文件或 docBase 的文件名中推断出来。

即使在 server.xml 中静态定义 Context 时,除非 docBase 不位于 HostappBase 下,或者 deployOnStartupautoDeploy 都为 false,否则不得设置此属性。如果不遵守此规则,很可能会导致重复部署。

preemptiveAuthentication

设置为 true 且用户为未受安全约束保护的资源提供凭据时,如果身份验证器支持抢先认证(Tomcat 提供的标准身份验证器支持),则用户的凭据将被处理。如果未指定,将使用默认值 false

privileged

设置为 true 以允许此 context 使用容器 servlet,例如管理器 servlet。使用 privileged 属性将把 context 的父类加载器更改为Server类加载器,而不是Shared类加载器。请注意,在默认安装中,Common 类加载器同时用于ServerShared 类加载器。

reloadable

如果您希望 Catalina 监视 /WEB-INF/classes//WEB-INF/lib 中的类以检测更改,并在检测到更改时自动重新加载 Web 应用程序,则设置为 true。此功能在应用程序开发期间非常有用,但它需要大量的运行时开销,不建议在已部署的生产应用程序上使用。因此,此属性的默认设置为 false。但是,您可以使用管理器 Web 应用程序按需触发已部署应用程序的重新加载。

resourceOnlyServlets

逗号分隔的 Servlet 名称列表(如 /WEB-INF/web.xml 中使用),这些 Servlet 期望存在资源。确保当没有资源存在时,不使用与期望存在资源的 Servlet(例如 JSP Servlet)关联的欢迎文件。这可以防止 Servlet 3.0 规范第 10.10 节中欢迎文件映射的澄清所引起的问题。如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系统属性设置为 true,则此属性的默认值将为空字符串,否则默认值将为 jsp

sendRedirectBody

如果为 true,重定向响应将包含一个简短的响应体,其中包含 RFC 2616 建议的重定向详细信息。默认情况下禁用此功能,因为包含响应体可能会导致某些应用程序组件(例如压缩过滤器)出现问题。

sessionCookieDomain

用于此 context 创建的所有会话 Cookie 的域。如果设置,此值将覆盖 Web 应用程序设置的任何域。如果未设置,将使用 Web 应用程序指定的值(如果有)。

sessionCookieName

用于此 context 创建的所有会话 Cookie 的名称。如果设置,此值将覆盖 Web 应用程序设置的任何名称。如果未设置,将使用 Web 应用程序指定的值(如果有),或者如果 Web 应用程序未显式设置,则使用名称 JSESSIONID

sessionCookiePath

用于此 context 创建的所有会话 Cookie 的路径。如果设置,此值将覆盖 Web 应用程序设置的任何路径。如果未设置,将使用 Web 应用程序指定的值,或者如果 Web 应用程序未显式设置,则使用 context path。要将所有 Web 应用程序配置为使用空路径(这对于 portlet 规范实现可能很有用),请在全局 CATALINA_BASE/conf/context.xml 文件中将此属性设置为 /

注意:一旦一个使用 sessionCookiePath="/" 的 Web 应用程序获取了会话,同一 Host 中所有其他同样配置了 sessionCookiePath="/" 的 Web 应用程序的后续会话将始终使用相同的会话 ID。即使会话无效并创建了新会话,此情况仍然成立。这使得会话固定保护更加困难,并且需要定制的、特定于 Tomcat 的代码来更改多个应用程序共享的会话 ID。

sessionCookiePathUsesTrailingSlash

一些浏览器(如 Internet Explorer、Safari 和 Edge)在请求 /foobar 时会为路径为 /foo 的 context 发送会话 Cookie,这违反了 RFC6265。这可能会将部署在 /foo 的应用程序的会话 ID 暴露给部署在 /foobar 的应用程序。如果部署在 /foobar 的应用程序不可信,这可能会造成安全风险。但是,需要注意的是,RFC 6265 第 8.5 节明确指出,仅路径本身不应被视为足以阻止不可信应用程序访问来自其他应用程序的 Cookie。为缓解此风险,此属性可以设置为 true,Tomcat 将在与会话 Cookie 关联的路径后添加一个尾部斜杠,因此在上述示例中,Cookie 路径变为 /foo/。然而,当 Cookie 路径为 /foo/ 时,浏览器将不再随对 /foo 的请求发送 Cookie。这不应该成为问题,除非有 servlet 映射到 /*。在这种情况下,需要将此属性设置为 false 以禁用此功能。此属性的默认值为 false

suspendWrappedResponseAfterForward

如果此标志的值为 true,Catalina 将在转发后暂停包装的响应,而不是关闭它们。如果未指定,此标志的默认值为 true

swallowAbortedUploads

如果 Tomcat 读取中止上传的任何额外请求体数据,而是中止客户端连接,则设置为 false。此设置在以下情况下使用:

  • 请求体大小大于连接器中配置的 maxPostSize
  • 达到 MultiPart 上传的大小限制
  • servlet 将响应状态设置为 413 (Request Entity Too Large)

不读取额外数据将更快地释放请求处理线程。不幸的是,大多数 HTTP 客户端如果无法写入完整的请求,将不会读取响应。

默认值为 true,因此将读取额外数据。

请注意,如果在请求处理期间发生错误并触发 5xx 响应,则任何未读的请求数据都将被忽略,并且一旦错误响应被写入,客户端连接将关闭。

swallowOutput

如果此标志的值为 true,则 Web 应用程序输出到 System.out 和 System.err 的字节将被重定向到 Web 应用程序日志器。如果未指定,此标志的默认值为 false

tldValidation

如果此标志的值为 true,TLD 文件将在 context 启动时进行 XML 验证。如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系统属性设置为 true,则此属性的默认值将为 true,否则默认值将为 false。将此属性设置为 true 将会带来性能开销。

useHttpOnly

是否应在会话 Cookie 上设置 HttpOnly 标志,以防止客户端脚本访问会话 ID?默认值为 true

usePartitioned

是否应在会话 Cookie 上设置 Partitioned 标志?默认值为 false

注意:用于指示作为 CHIPS 一部分的区分式 Cookie 的属性名称未由 RFC 定义,并且一旦等效功能包含在 RFC 中,可能会以不向后兼容的方式更改。

useRelativeRedirects

控制调用 jakarta.servlet.http.HttpServletResponse#sendRedirect(String) 生成的 HTTP 1.1 及更高版本的 location 头部是否使用相对或绝对重定向。相对重定向更高效,但可能不适用于更改 context path 的反向代理。需要注意的是,不建议使用反向代理更改 context path,因为它会产生多个问题。绝对重定向应该适用于更改 context path 的反向代理,但如果过滤器更改了 scheme 和/或端口,可能会导致 org.apache.catalina.filters.RemoteIpFilter 出现问题。如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系统属性设置为 true,则此属性的默认值将为 false,否则默认值将为 true

validateClientProvidedNewSessionId

当客户端为新会话提供 ID 时,此属性控制该 ID 是否经过验证。使用客户端提供的会话 ID 的唯一用例是在多个 Web 应用程序之间拥有一个共同的会话 ID。因此,任何客户端提供的会话 ID 都应该已存在于另一个 Web 应用程序中。如果启用此检查,则仅当会话 ID 存在于当前 Host 的至少一个其他 Web 应用程序中时,才使用客户端提供的会话 ID。请注意,无论此设置如何,以下附加测试始终适用:

  • 会话 ID 由 Cookie 提供
  • 会话 Cookie 的路径为 /

如果未指定,将使用默认值 true

wrapperClass

将用于此 Context 管理的 servlet 的 org.apache.catalina.Wrapper 实现类的 Java 类名。如果未指定,将使用标准默认值。

xmlBlockExternal

如果此标志的值为 true,则此 Web 应用程序的 web.xmlweb-fragment.xmltomcat-web.xml*.tld*.jspx*.tagxtagPlugins.xml 文件的解析将不允许加载外部实体。如果未指定,将使用默认值 true

xmlNamespaceAware

如果此标志的值为 true,则此 Web 应用程序的 web.xmlweb-fragment.xmltomcat-web.xml 文件的解析将支持命名空间。请注意,*.tld*.jspx*.tagx 文件始终使用支持命名空间的解析器进行解析,而 tagPlugins.xml 文件(如果有)从不使用支持命名空间的解析器进行解析。另请注意,如果您启用此标志,您可能还应该启用 xmlValidation。如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系统属性设置为 true,则此属性的默认值将为 true,否则默认值将为 false。将此属性设置为 true 将会带来性能开销。

xmlValidation

如果此标志的值为 true,则此 Web 应用程序的 web.xmlweb-fragment.xmltomcat-web.xml 文件的解析将使用验证解析器。如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系统属性设置为 true,则此属性的默认值将为 true,否则默认值将为 false。将此属性设置为 true 将会带来性能开销。

标准实现

Context 的标准实现是 org.apache.catalina.core.StandardContext。它支持以下附加属性(除了上面列出的通用属性):

属性描述
addWebinfClassesResources

此属性控制除了从 Web 应用程序 JAR 文件内部的 META-INF/resources 提供静态资源外,是否也从 WEB-INF/classes/META-INF/resources 提供静态资源。这仅适用于主版本为 3 或更高的 Web 应用程序。由于这是 Servlet 3 规范的专有扩展,因此默认情况下禁用。要启用此功能,请将属性设置为 true

antiResourceLocking

如果为 true,Tomcat 将防止任何文件锁定。这会显着影响应用程序的启动时间,但在可能发生文件锁定的平台或配置上,允许 Web 应用程序完全热部署和取消部署。如果未指定,默认值为 false

请注意,将其设置为 true 会产生一些副作用,包括在运行的服务器中禁用 JSP 重新加载:请参阅 Bugzilla 37668

请注意,在 Host 的 appBase 之外的应用程序(默认是 webapps 目录)中将此标志设置为 true 将导致应用程序在 Tomcat 关闭时被删除。您可能不希望这样做,因此在为 Host 的 appBase 之外的 Web 应用程序设置 antiResourceLocking=true 之前请三思。

clearReferencesHttpClientKeepAliveThread

如果为 true 并且此 Web 应用程序已启动且仍在运行 sun.net.www.http.HttpClient keep-alive 计时器线程,Tomcat 会将该线程的 context 类加载器从 Web 应用程序类加载器更改为 Web 应用程序类加载器的父级,以防止内存泄漏。请注意,keep-alive 计时器线程会在所有 keep-alive 过期后自行停止,然而,在繁忙的系统中,这可能需要一些时间才能发生。如果未指定,将使用默认值 true

clearReferencesRmiTargets

如果为 true,Tomcat 会查找与 RMI Targets 关联的内存泄漏并清除发现的任何泄漏。此功能使用反射来识别泄漏,因此需要设置命令行选项 -XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED。没有内存泄漏的应用程序在此属性设置为 false 时应正常运行。如果未指定,将使用默认值 true

clearReferencesStopThreads

如果为 true,Tomcat 会尝试终止由 Web 应用程序启动的线程。终止线程通过已弃用(有充分理由)的 Thread.stop() 方法执行,并且很可能导致不稳定。因此,在开发环境中,启用此功能应被视为最后的选择,不建议在生产环境中使用。如果未指定,将使用默认值 false。如果启用此功能,Web 应用程序可能需要多达两秒钟才能停止,因为执行器线程有长达两秒钟的时间来优雅地停止,之后才对任何剩余线程调用 Thread.stop()

clearReferencesStopTimerThreads

如果为 true,Tomcat 会尝试终止由 Web 应用程序启动的 java.util.Timer 线程。与标准线程不同,计时器线程可以安全停止,尽管仍可能对应用程序产生副作用。如果未指定,将使用默认值 false

clearReferencesThreadLocals

如果为 true,Tomcat 会尝试清除已由 Web 应用程序加载的类填充的 java.lang.ThreadLocal 变量。如果未指定,将使用默认值 true

copyXML

如果希望嵌入在应用程序内部(位于 /META-INF/context.xml)的 context XML 描述符在应用程序部署时复制到所属 HostxmlBase,则设置为 true。在随后的启动中,复制的 context XML 描述符将优先于嵌入在应用程序内部的任何 context XML 描述符使用,即使嵌入在应用程序内部的描述符更新。默认值为 false。请注意,如果所属 HostdeployXML 属性为 false,或者所属 HostcopyXML 属性为 true,则此属性将不起作用。

jndiExceptionOnFailedWrite

如果为 true,则应用程序尝试通过调用 bind()、unbind()、createSubContext()、destroySubContext() 或 close() 来修改提供的 JNDI context,将根据 Jakarta EE 规范 EE.5.3.4 节的要求触发 javax.naming.OperationNotSupportedException。通过将此属性设置为 false 可以禁用此异常,在这种情况下,任何修改 JNDI context 的调用都将返回,做任何更改,并且返回值的方法将返回 null。如果未指定,将使用符合规范的默认值 true

notFoundClassResourceCacheSize

类资源不被标准资源实现缓存,因为它们在首次使用时加载,然后就不再需要该资源了。然而,缓存未找到的类确实有帮助,因为在某些情况下,同一个类会被多次搜索,并且 JAR/类的数量越多,搜索时间就越长。使用 LRU 缓存,此属性控制该缓存的大小。小于 1 的值将禁用缓存。如果未指定,将使用默认值 1000。

renewThreadsWhenStoppingContext

如果为 true,当此 context 停止时,Tomcat 会更新用于服务此 context 的线程池中的所有线程。这还需要在 server.xml 中配置 ThreadLocalLeakPreventionListener,并且 ExecutorthreadRenewalDelay 属性大于等于 0。如果未指定,将使用默认值 true

skipMemoryLeakChecksOnJvmShutdown

如果为 true,当 Web 应用程序作为 JVM 关闭的一部分停止时,Tomcat 将不执行通常的内存泄漏检查。如果未指定,将使用默认值 false

unloadDelay

容器等待 servlet 卸载的毫秒数。如果未指定,默认值为 2000 毫秒。

unpackWAR

如果为 false,所属 HostunpackWARs 属性将被覆盖,并且 WAR 文件将不会被解压。如果为 true,所属 HostunpackWARs 属性值将决定 WAR 是否被解压。如果未指定,默认值为 true

useNaming

设置为 true(默认值),使 Catalina 为此 Web 应用程序启用一个与 Jakarta EE 平台约定兼容的 JNDI InitialContext

workDir

此 Context 为相关 Web 应用程序中的 servlet 提供的临时读写使用的暂存目录路径名。此目录将通过名为 jakarta.servlet.context.tempdir 的 servlet context 属性(类型为 java.io.File)对 Web 应用程序中的 servlet 可见,如 Servlet 规范中所述。如果未指定,将提供 $CATALINA_BASE/work 下的合适目录。

嵌套组件

您可以通过在 Context 元素内部嵌套相应的元素,最多嵌套以下实用组件的一个实例:

  • Cookie 处理器 - 配置 HTTP Cookie 头部的解析和生成。
  • 加载器 - 配置将用于加载此 Web 应用程序的 servlet 和 bean 类的 Web 应用程序类加载器。通常,类加载器的默认配置就足够了。
  • 管理器 - 配置将用于为此 Web 应用程序创建、销毁和持久化 HTTP 会话的会话管理器。通常,会话管理器的默认配置就足够了。
  • Realm - 配置一个 Realm,允许其用户数据库及其关联角色仅用于此特定 Web 应用程序。如果未指定,此 Web 应用程序将使用与所属 HostEngine 关联的 Realm。
  • 资源 - 配置将用于访问与此 Web 应用程序关联的静态资源的资源管理器。通常,资源管理器的默认配置就足够了。
  • 被监视资源 (WatchedResource) - 自动部署器将监视 Web 应用程序的指定静态资源以检测更新,并在更新时重新加载 Web 应用程序。此元素的内容必须是字符串。
  • Jar扫描器 - 配置将用于扫描 Web 应用程序以查找 JAR 文件和类文件目录的 Jar 扫描器。它通常在 Web 应用程序启动期间用于识别配置文件,例如必须作为 Web 应用程序初始化的一部分进行处理的 TLD 或 web-fragment.xml 文件。通常,默认的 Jar 扫描器配置就足够了。

特殊功能

日志

一个 context 与 org.apache.catalina.core.ContainerBase.[enginename].[hostname].[path] 日志类别相关联。请注意,括号实际上是名称的一部分,不要省略它们。

访问日志

当您运行 Web 服务器时,通常生成的一个输出文件是访问日志,它以标准格式为服务器处理的每个请求生成一行信息。Catalina 包含一个可选的 Valve 实现,该实现可以以 Web 服务器创建的相同标准格式或任何数量的自定义格式创建访问日志。

您可以要求 Catalina 通过像这样嵌套一个 Valve 元素,为由 EngineHostContext 处理的所有请求创建访问日志:

<Context>
  ...
  <Valve className="org.apache.catalina.valves.AccessLogValve"
         prefix="localhost_access_log" suffix=".txt"
         pattern="common"/>
  ...
</Context>

有关支持的配置属性的更多信息,请参阅访问日志记录 Valve

自动 Context 配置

如果您使用标准 Context 实现,当 Catalina 启动时,或每当此 Web 应用程序重新加载时,以下配置步骤将自动发生。无需特殊配置即可启用此功能。

  • 如果您尚未声明自己的 加载器 元素,将配置一个标准 Web 应用程序类加载器。
  • 如果您尚未声明自己的 管理器 元素,将配置一个标准会话管理器。
  • 如果您尚未声明自己的 资源 元素,将配置一个标准资源管理器。
  • conf/web.xml 中列出的 Web 应用程序属性将作为此 Web 应用程序的默认值进行处理。这用于建立默认映射(例如将 *.jsp 扩展名映射到相应的 JSP servlet),以及适用于所有 Web 应用程序的其他标准功能。
  • 此 Web 应用程序的 /WEB-INF/tomcat-web.xml 资源中列出的 Web 应用程序属性将被处理(如果此资源存在),并优先于默认值。
  • 此 Web 应用程序的 /WEB-INF/web.xml 资源中列出的 Web 应用程序属性将被处理(如果此资源存在)。
  • 如果您的 Web 应用程序指定了可能需要用户认证的安全约束,将配置一个实现您选择的登录方法的适当 Authenticator。

Context 参数

您可以通过在此元素内部嵌套 <Parameter> 元素来配置命名值,这些值将作为 servlet context 初始化参数对 Web 应用程序可见。例如,您可以像这样创建一个初始化参数:

<Context>
  ...
  <Parameter name="companyName" value="My Company, Incorporated"
         override="false"/>
  ...
</Context>

这等同于在 Web 应用程序部署描述符 (/WEB-INF/web.xml) 中包含以下元素:

<context-param>
  <param-name>companyName</param-name>
  <param-value>My Company, Incorporated</param-value>
</context-param>

不需要修改部署描述符来定制此值。

<Parameter> 元素的有效属性如下:

属性描述
描述

可选,此 context 初始化参数的人类可读描述。

名称

要创建的 context 初始化参数的名称。

override

如果您希望 Web 应用程序部署描述符中找到的同名 <context-param> 覆盖此处指定的值,则将其设置为 false。默认情况下,允许覆盖。

当应用程序通过调用 ServletContext.getInitParameter() 请求时,将呈现给应用程序的参数值。

环境条目

您可以通过在此元素内部嵌套 <Environment> 条目来配置命名值,这些值将作为环境条目资源对 Web 应用程序可见。例如,您可以像这样创建一个环境条目:

<Context>
  ...
  <Environment name="maxExemptions" value="10"
         type="java.lang.Integer" override="false"/>
  ...
</Context>

这等同于在 Web 应用程序部署描述符 (/WEB-INF/web.xml) 中包含以下元素:

<env-entry>
  <env-entry-name>maxExemptions</env-entry-name>
  <env-entry-value>10</env-entry-value>
  <env-entry-type>java.lang.Integer</env-entry-type>
</env-entry>

不需要修改部署描述符来定制此值。

<Environment> 元素的有效属性如下:

属性描述
描述

可选,此环境条目的人类可读描述。

名称

要创建的环境条目的名称,相对于 java:comp/env context。

override

如果您希望 Web 应用程序部署描述符中找到的同名 <env-entry> 覆盖此处指定的值,则将其设置为 false。默认情况下,允许覆盖。

类型

Web 应用程序为此环境条目期望的完全限定 Java 类名。必须是 Web 应用程序部署描述符中 <env-entry-type> 的合法值。

当从 JNDI context 请求时,将呈现给应用程序的参数值。此值必须可转换为 type 属性定义的 Java 类型。

生命周期监听器

如果您实现了一个需要知道此 Context 何时启动或停止的 Java 对象,您可以通过在此元素内部嵌套一个 Listener 元素来声明它。您指定的类名必须实现 org.apache.catalina.LifecycleListener 接口,并且该类必须打包成 jar 并放置在 $CATALINA_HOME/lib 目录中。它将收到相应生命周期事件发生的通知。此类监听器的配置如下所示:

<Context>
  ...
  <Listener className="com.mycompany.mypackage.MyListener" ... >
  ...
</Context>

请注意,监听器可以有任意数量的附加属性,这些属性可以从该元素配置。属性名称使用标准属性方法命名模式与相应的 JavaBean 属性名称匹配。

请求过滤器

您可以要求 Catalina 检查指向周围 EngineHostContext 元素的每个传入请求的 IP 地址或主机名。远程地址或名称将根据配置的“接受”和/或“拒绝”过滤器进行检查,这些过滤器使用 java.util.regex 正则表达式语法定义。来自不接受位置的请求将被 HTTP“Forbidden”错误拒绝。示例过滤器声明:

<Context>
  ...
  <Valve className="org.apache.catalina.valves.RemoteHostValve"
         allow=".*\.mycompany\.com|www\.yourcompany\.com"/>
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         deny="192\.168\.1\.\d+"/>
  ...
</Context>

有关支持的配置选项的更多信息,请参阅远程地址过滤器远程主机过滤器

资源定义

您可以声明将为 Web 应用程序部署描述符中 <resource-ref><resource-env-ref> 元素的 JNDI 查找返回的资源的特性。您还必须将所需的资源参数定义为 Resource 元素的属性,以配置要使用的对象工厂(如果 Tomcat 尚不知道)以及用于配置该对象工厂的属性。

例如,您可以像这样创建一个资源定义:

<Context>
  ...
  <Resource name="jdbc/EmployeeDB" auth="Container"
            type="javax.sql.DataSource"
     description="Employees Database for HR Applications"/>
  ...
</Context>

这等同于在 Web 应用程序部署描述符 (/WEB-INF/web.xml) 中包含以下元素:

<resource-ref>
  <description>Employees Database for HR Applications</description>
  <res-ref-name>jdbc/EmployeeDB</res-ref-name>
  <res-ref-type>javax.sql.DataSource</res-ref-type>
  <res-auth>Container</res-auth>
</resource-ref>

不需要修改部署描述符来定制此值。

<Resource> 元素的有效属性如下:

属性描述
auth

指定 Web 应用程序代码是否以编程方式登录到相应的资源管理器,或者容器是否代表应用程序登录到资源管理器。此属性的值必须为 ApplicationContainer。如果 Web 应用程序将在 Web 应用程序部署描述符中使用 <resource-ref> 元素,则此属性为必需;但如果应用程序改用 <resource-env-ref>,则为可选。

closeMethod

当不再需要单例资源时,要调用的零参数方法的名称。这旨在加速资源的清理,否则这些清理将作为垃圾回收的一部分发生。如果 singleton 属性为 false,则此属性将被忽略。

对于实现 AutoCloseablejavax.sql.DataSourcejavax.sql.XADataSource 资源(例如 Apache Commons DBCP 2 和默认的 Apache Tomcat 连接池),此属性默认值为 close。可以通过将属性设置为空字符串来禁用此功能。对于所有其他资源类型,未定义默认值,默认情况下不会调用任何 close 方法。

描述

可选,此资源的人类可读描述。

名称

要创建的资源的名称,相对于 java:comp/env context。

范围

指定通过此资源管理器获取的连接是否可以共享。此属性的值必须为 ShareableUnshareable。默认情况下,连接被假定为可共享的。

单例

指定此资源定义是否适用于单例资源,即资源只有一个实例。如果此属性为 true,则对此资源的多次 JNDI 查找将返回相同的对象。如果此属性为 false,则对此资源的多次 JNDI 查找将返回不同的对象。对于 javax.sql.DataSource 资源,此属性必须为 true,以启用 DataSource 的 JMX 注册。此属性的值必须为 truefalse。默认情况下,此属性为 true

类型

当 Web 应用程序对此资源执行查找时,期望的完全限定 Java 类名。

此元素用于创建指向全局 JNDI 资源的链接。对链接名称执行 JNDI 查找将返回链接的全局资源。

例如,您可以像这样创建一个资源链接:

<Context>
  ...
  <ResourceLink name="linkToGlobalResource"
            global="simpleValue"
            type="java.lang.Integer"
  ...
</Context>

<ResourceLink> 元素的有效属性如下:

属性描述

当属性 factory="org.apache.naming.factory.DataSourceLinkFactory" 时,资源链接可以与两个附加属性一起使用,以允许共享数据源与不同的凭据一起使用。当这两个附加属性与 javax.sql.DataSource 类型结合使用时,不同的 context 可以使用不同的凭据共享全局数据源。在幕后,对 getConnection() 的调用被简单地转换为对全局数据源的 getConnection(username, password) 调用。这是一种使代码对正在使用的架构透明,但又能够在全局配置中控制连接(或连接池)的简单方法。

属性描述

共享数据源示例

警告:此功能仅在全局 DataSource 支持 getConnection(username, password) 方法时才有效。Tomcat 默认使用的 Apache Commons DBCP 2 连接池不支持此功能。请查阅 BasicDataSource 类的 Javadoc。Apache Tomcat JDBC 连接池支持此功能,但默认情况下此支持是禁用的,可以通过 alternateUsernameAllowed 属性启用。有关详细信息,请参阅其文档。

<GlobalNamingResources>
  ...
  <Resource name="sharedDataSource"
            global="sharedDataSource"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            alternateUsernameAllowed="true"
            username="bar"
            password="barpass"
            ...
  ...
</GlobalNamingResources>

<Context path="/foo"...>
  ...
  <ResourceLink
            name="appDataSource"
            global="sharedDataSource"
            type="javax.sql.DataSource"
            factory="org.apache.naming.factory.DataSourceLinkFactory"
            username="foo"
            password="foopass"
  ...
</Context>
<Context path="/bar"...>
  ...
  <ResourceLink
            name="appDataSource"
            global="sharedDataSource"
            type="javax.sql.DataSource"
  ...
</Context>

当在 /foo context 中发出 getConnection() 请求时,该请求被转换为 getConnection("foo","foopass"),而在 /bar 中的请求则直接传递。

事务

您可以声明将为 java:comp/UserTransaction 的 JNDI 查找返回的 UserTransaction 的特性。您必须定义一个对象工厂类来实例化此对象,以及将所需的资源参数作为 Transaction 元素的属性,以及用于配置该对象工厂的属性。

<Transaction> 元素的有效属性如下:

属性描述
工厂

JNDI 对象工厂的类名。