Context简介

Context元素代表一个Web 应用程序,它在特定的虚拟主机中运行。处理每个 HTTP 请求的 Web 应用程序,都是基于将请求 URI的前缀与每个定义的Context的*Context路径进行匹配。* 一旦选择,该Context将根据 Web应用程序部署定义的 servlet 映射选择适当的 servlet 来处理传入请求。可以根据需要定义任意数量的Context元素。每个Context必须在Host中具有唯一的Context名称。Context路径不需要是唯一的(参考并行部署)。此外,必须定义一个0长度的Context路径。这个Context成为此虚拟主机的默认 Web 应用程序,用于处理与任何其他 Context 的Context路径不匹配的所有请求。

定义一个Context

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

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

在应用程序文件中的/META-INF/context.xml单独文件中。在$CATALINA_BASE/conf/[enginename]/[hostname]/目录下的单个文件(扩展名为".xml")中。context路径和版本将从文件的基本名称(文件名减去.xml扩展名)派生。这个文件总是优先于web应用程序的META-INF目录中打包的任何context.xml文件。在conf/server.xml的Host元素中。 属性

公共属性:

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

属性描述allowCasualMultipartParsing设置为true时Tomcat在HttpServletRequest时自动解析multipart/form-data数据请求体。HttpServletRequest.getPart可以获取到数据。注意,除false之外的任何设置都会导致Tomcat的行为在技术上不符合规范。默认值为false。allowMultipleLeadingForwardSlashInPathTomcat将URI中多个/字符的序列规范化为单个/。这是为了与文件系统的行为保持一致,因为uri通常被转换为文件系统路径。因此,对于某些uri, HttpServletRequest#getContextPath()的返回值应该以多个/字符开头。如果这个值直接与HttpServletResponse#sendRedirect()一起使用,作为以//开头的重定向路径被视为协议相对重定向,这将导致问题。为了避免潜在的问题,Tomcat会将HttpServletRequest#getContextPath()返回值开头的多个前导/字符分解为一个/。该属性的默认值为false,它支持多个/字符的折叠。要禁用此行为,请将此属性设置为true。altDDName默认加载/WEB-INF/web.xml路径的web.xml。该值可以指定你想加载的web.xml路径。例如altDDName=“/test/test.xml”那么web配置将启用test路径下的test.xmlalwaysAccessSession如果设置为true,那么与会话关联的每个请求都将更新会话的最后访问时间,而不管请求是否显式访问会话。如果org.apache.catalina.STRICT_SERVLET_COMPLIANCE设置为true,则该设置的默认值将为true,否则默认值将为false。backgroundProcessorDelay此值表示在此上下文上调用backgroundProcess方法及其子容器(包括所有包装器)之间的延迟(以秒为单位)。如果子容器的延迟值不是负的(这意味着它们正在使用自己的处理线程),则不会调用它们。将此值设置为正值将导致生成线程。在等待指定的时间之后,线程将调用此主机及其所有子容器上的backgroundProcess方法。上下文将使用后台处理来执行会话过期和类监视以便重新加载。如果不指定,该属性的默认值是-1,这意味着上下文将依赖于其父主机的后台处理线程。className要使用的实现的Java类名。这个类必须实现org.apache.catalina.Context接口。如果没有指定,将使用标准值。containerSciFilter指定提供scsi应该被过滤掉,并且不用于此上下文中。需匹配容器的完全限定类名的子字符串,提供SCI以便将其过滤掉。如果未指定,则不会过滤。contextGetResourceRequiresSlash如果为true,那么传递给ServletContext.getResource()或servletcontext.getresourcestream()的路径必须以“/”开头。如果为false,像getResource(“myfolder/myresource.txt”)这样的代码将工作,因为Tomcat将在提供的路径前加上"/"。如果org.apache.catalina.STRICT_SERVLET_COMPLIANCE设置为true,则该设置的默认值将为true,否则默认值将为false。cookies设置为true(这是默认值),cookie的值为session id(如果客户机支持的话),否则将不会用作session id通信createUploadTargets如果Tomcat尝试为Servlet创建MultipartConfig中指定的临时上传位置(如果该位置不存在),则设置为true。如果没有指定,将使用默认值false。crossContext设置为true,在此应用程序中调用ServletContext.getContext()为运行在此虚拟主机上的其他web应用程序返回请求分配器。在安全意识强的环境中设置为false(默认值),以使getContext()总是返回null。dispatcherWrapsSameObject如果为true,那么将检查传递给应用程序调度器的任何已包装的请求或响应对象,以确保它已包装了原始请求或响应。如果org.apache.catalina.STRICT_SERVLET_COMPLIANCE设置为true,则此设置的默认值为true;否则,默认值为false。docBase此web应用程序的Document Base(也称为Context Root)目录,或web应用程序归档文件的路径名(如果该web应用程序是直接从WAR文件执行的)。可以指定此目录或WAR文件的绝对路径名,或相对于Host的appBase目录的路径名。除非在server.xml定义了Context元素或docBase不在Host的appBase下,否则不能设置此字段的值。dispatchersUseEncodedPaths控制在调用中用于获取请求分派器的路径是否应该被编码。 这会影响 Tomcat 如何处理调用以获取请求调度程序以及 Tomcat 如何生成用于在内部获取请求调度程序的路径。 如果未指定,则使用默认值 true。 在为请求调度程序编码/解码路径时,始终使用 UTF-8。failCtxIfServletStartFails如果设置为 true,任何加载时启动servlet自身启动失败,上下文启动失败。如果未指定,则使用父 Host 配置中的同名属性(如果指定)。 否则使用默认值 false。fireRequestListenersOnForwards设置为 true 以在 Tomcat 转发请求时触发任何已配置的 ServletRequestListener。 这主要用于使用 ServletRequestListeners 为请求配置必要环境的 CDI 框架的用户。 如果未指定,则使用默认值 false。logEffectiveWebXml设置为 true在应用程序启动时记录(在 INFO 级别)用于 Web 应用程序的有效 web.xml。 有效的 web.xml 是应用程序的 web.xml 与 Tomcat 配置的任何默认值以及发现的任何 web-fragment.xml 文件和注释相结合的结果。 如果未指定,则使用默认值 false。mapperContextRootRedirectEnabled如果启用,对 Web 应用程序上下文根的请求将在必要时由 Mapper 而不是默认的 Servlet 重定向(添加尾部斜杠)。 这更有效,但具有确认上下文路径存在的副作用。 如果未指定,则使用默认值 true。mapperDirectoryRedirectEnabled如果启用,Web 应用程序目录的请求将在必要时由 Mapper 而不是默认的 Servlet 重定向(添加尾部斜杠)。 这更有效,但具有确认目录存在的副作用。 如果未指定,则使用默认值 false。override设置为 true 以忽略全局或主机默认上下文中的任何设置。 默认情况下,将使用来自默认上下文的设置,但可以通过为上下文显式设置相同的属性来覆盖。parallelAnnotationScanning当设置为 true 时,注释扫描将使用实用程序执行器执行。 它将允许并行处理扫描,这可能会以更高的服务器负载为代价来改进部署类型。 如果未指定,则使用默认值 false。path 此 Web 应用程序的上下文路径,与每个请求 URI 的开头相匹配,以选择适当的 Web 应用程序进行处理。 特定主机中的所有上下文路径都必须是唯一的。 如果您指定空字符串 (“”) 的上下文路径,则您正在为此主机定义默认 Web 应用程序,它将处理所有未分配给其他上下文的请求。只有在 server.xml 中静态定义 Context 时才必须使用此属性。 在所有其他情况下,将从用于 .xml 上下文文件或 docBase 的文件名推断路径。即使在 server.xml 中静态定义 Context 时,也不得设置此属性,除非 docBase 不在 Host 的 appBase 下,或者 deployOnStartup 和 autoDeploy 都为 false。 如果不遵守此规则,很可能导致双重部署。preemptiveAuthentication当设置为 true 并且用户为不受安全约束保护的资源提供凭据时,如果身份验证器支持抢先式身份验证(Tomcat 提供的标准身份验证器支持),则将处理用户的凭据。 如果未指定,则使用默认值 false。privileged设置为 true 以允许此上下文使用容器 servlet,如管理器 servlet。 使用特权属性会将上下文的父类加载器更改为服务器类加载器而不是共享类加载器。 请注意,在默认安装中,公共类加载器用于服务器和共享类加载器。reloadable设置为 true,会监视 /WEB-INF/classes/ 和 /WEB-INF/lib 中的类的更改,并在检测到更改时自动重新加载 Web 应用程序。 此功能在应用程序开发期间非常有用,但它需要大量运行时开销,因此不建议在已部署的生产应用程序中使用。 这就是该属性的默认设置为 false 的原因。 但是,可以使用 Manager Web 应用程序来按需触发重新加载已部署的应用程序。resourceOnlyServlets期望资源存在的 Servlet 名称的逗号分隔列表(在 /WEB-INF/web.xml 中使用)。 确保在不存在资源时不使用与期望存在资源的 Servlet(例如 JSP Servlet)关联的欢迎文件。 这可以防止由于 Servlet 3.0 规范第 10.10 节中对欢迎文件映射的澄清而引起的问题。 如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系统属性设置为 true,则该属性的默认值为空字符串,否则默认值为 jsp。sendRedirectBody如果为 true,则重定向响应将包含一个简短的响应正文,其中包含 RFC 2616 建议的重定向详细信息。默认情况下禁用此功能,因为包含响应正文可能会导致某些应用程序组件(例如压缩过滤器)出现问题。sessionCookieDomain用于为此上下文创建的所有会话 cookie 的域。 如果设置,这将覆盖 Web 应用程序设置的任何域。 如果未设置,将使用 Web 应用程序指定的值(如果有)。sessionCookieName用于为此上下文创建的所有会话 cookie 的名称。 如果设置,这将覆盖 Web 应用程序设置的任何名称。 如果未设置,则将使用 Web 应用程序指定的值(如果有),或者如果 Web 应用程序未明确设置,则使用名称 JSESSIONID。sessionCookiePath用于为此上下文创建的所有会话 cookie 的路径。 如果设置,这将覆盖 Web 应用程序设置的任何路径。 如果未设置,则将使用 Web 应用程序指定的值,如果 Web 应用程序未明确设置,则使用上下文路径。 要将所有 Web 应用程序配置为使用空路径(这对于 portlet 规范实现很有用),请在全局 CATALINA_BASE/conf/context.xml 文件中将此属性设置为 /。注意:一旦一个使用 sessionCookiePath=“/” 的 Web 应用程序获得一个会话,同一主机中的任何其他 Web 应用程序的所有后续会话也配置了 sessionCookiePath=“/” 将始终使用相同的会话 ID。 即使会话无效并创建了一个新会话,这仍然成立。 这使得会话固定保护更加困难,并且需要自定义的 Tomcat 特定代码来更改多个应用程序共享的会话 ID。sessionCookiePathUsesTrailingSlash某些浏览器,如 Internet Explorer、Safari 和 Edge,将发送一个会话 cookie,用于一个路径为 /foo 的上下文,并违反 RFC6265 对 /foobar 的请求。这可能会将部署在 /foo 的应用程序的会话 ID 暴露给部署在 /foobar 的应用程序。如果部署在 /foobar 的应用程序不受信任,则可能会产生安全风险。但是,应该注意的是,RFC 6265 第 8.5 节明确指出,仅路径不应被视为足以防止不受信任的应用程序从其他应用程序访问 cookie。为了降低这种风险,可以将此属性设置为 true,并且 Tomcat 将在与会话 cookie 关联的路径中添加一个斜杠,因此,在上面的示例中,cookie 路径变为 /foo/。但是,使用 /foo/ 的 cookie 路径,浏览器将不再将 cookie 与 /foo 的请求一起发送。除非有映射到 /* 的 servlet,否则这应该不是问题。在这种情况下,需要将此属性设置为 false 以禁用此功能。此属性的默认值为 false。swallowAbortedUploads如果 Tomcat 不应该为中止的上传读取任何额外的请求正文数据,而是中止客户端连接,则设置为 false。 此设置用于以下情况:1、请求正文的大小大于连接器中配置的 maxPostSize。2、已达到 MultiPart 上传的大小限制3、servlet 将响应状态设置为 413(请求实体太大)。不读取附加数据将更快地释放请求处理线程。 不幸的是,如果大多数 HTTP 客户端无法写入完整的请求,他们将不会读取响应。默认值为 true,因此将读取附加数据。请注意,如果在请求处理过程中发生触发 5xx 响应的错误,任何未读请求数据将始终被忽略,并且一旦写入错误响应,客户端连接将被关闭。swallowOutput如果此标志的值为 true,则 Web 应用程序输出到 System.out 和 System.err 的字节将被重定向到 Web 应用程序记录器。 如果未指定,则标志的默认值为 false。tldValidation如果设置为true,则TLD文件将在上下文启动时进行XML验证。如果org.apache.catalina.STRICT_SERVLET_COMPLIANCE系统属性设置为true,则该属性的默认值为true,否则默认值为false。将此属性设置为true将导致性能损失。useBloomFilterForArchives如果为true,那么将使用bloom过滤器来查找JAR的。如果未指定,将使用默认值false。useHttpOnly是否应该在会话cookie上设置HttpOnly标志以防止客户端脚本访问会话ID?默认值为true。useRelativeRedirectsjakarta.servlet.http.HttpServletResponse#sendRedirect(String) 使用相对重定向还是绝对重定向。相对重定向更有效,但可能不适用于更改上下文路径的反向代理。应该注意的是,不建议使用反向代理来更改上下文路径,因为它会产生多个问题。绝对重定向应该与更改上下文路径的反向代理一起使用,如果org.apache.catalina.filters.RemoteIpFilter过滤器正在更改方案和/或端口,则可能会导致问题。如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系统属性设置为 true,则该属性 false的默认值为 ,否则默认值为true。validateClientProvidedNewSessionId当客户端为新会话提供 ID 时,此属性控制是否验证该 ID。使用客户端提供的会话 ID 的唯一用例是在多个 Web 应用程序中拥有一个公共会话 ID。因此,任何客户端提供的会话 ID 都应该已经存在于另一个 Web 应用程序中。如果启用此检查,则仅当会话 ID 存在于当前主机的至少一个其他 Web 应用程序中时,才会使用客户端提供的会话 ID。如果未指定,将使用默认值true。wrapperClasswrapper实现类的Java类名,它将用于此Context管理的servlet。如果未指定,则使用标准默认值。xmlBlockExternal如果设置为true,则解析web.xml、web-fragment.xml、tomcat-web.xml、*. xml。tld, *。jspx, *。此web应用程序的tagx和tagPlugins.xml文件将不允许加载外部实体。如果未指定,将使用默认值true。xmlNamespaceAware如果设置为true,则此web应用程序的web.xml、web-fragment.xml和tomcat-web.xml文件的解析将是名称空间感知的。注意*。tld, 。jspx和。tagx文件总是使用支持名称空间的解析器进行解析,而tagPlugins.xml文件(如果有的话)从不使用支持名称空间的解析器进行解析。还要注意,如果打开这个标志,可能还应该打开xmlValidation。如果org.apache.catalina.STRICT_SERVLET_COMPLIANCE系统属性设置为true,则该属性的默认值为true,否则默认值为false。将此属性设置为true将导致性能损失。xmlValidation如果为true,则此web应用程序的web.xml、web-fragment.xml和tomcat-web.xml文件的解析将使用验证解析器。如果org.apache.catalina.STRICT_SERVLET_COMPLIANCE系统属性设置为true,则该属性的默认值为true,否则默认值为false。将此属性设置为true将导致性能损失。

附加属性:

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

属性描述addWebinfClassesResources这个属性控制的是,除了从web应用程序JAR文件中的META-INF/资源提供静态资源外,静态资源还从web - inf /classes/META-INF/resources提供。这只适用于主要版本为3或更高的web应用程序。由于这是Servlet 3规范的专有扩展,默认情况下是禁用的。要启用该特性,请将该属性设置为true。antiResourceLocking如果为true, Tomcat将阻止任何文件锁定。这将显著影响应用程序的启动时间,但允许在可能发生文件锁定的平台或配置上进行完整的webapp热部署和取消部署。如果不指定,默认值为false。注意,将此设置为true会产生一些副作用,包括禁用正在运行的服务器中的JSP重新加载:请参阅Bugzilla 37668。在主机的appBase(默认为webapps目录)之外的应用程序中将此标志设置为true将导致应用程序在Tomcat关闭时被删除。所以在为主机在appBase之外的webapp上设置antiResourceLocking=true之前要三思。clearReferencesHttpClientKeepAliveThread如果为true并且sun.net.www.http.HttpClient keep-alive计时器线程已经被这个web应用程序启动并且仍然在运行,Tomcat将会把该线程的上下文类装载器从web应用程序类装载器更改为web应用程序类装载器的父类装载器,以防止内存泄漏。注意,当所有的保持活动都过期时,保持活动计时器线程将自动停止,但是在一个繁忙的系统上,这可能在一段时间内都不会发生。如果未指定,将使用默认值true。clearReferencesObjectStreamClassCaches如果为true,当web应用程序停止时,Tomcat在用于序列化的ObjectStreamClass类中查找web应用程序加载的类的SoftReferences,并清除它找到的任何SoftReferences。该特性使用反射来识别SoftReferences,因此需要命令行选项-XaddExports:java.base/java. properties.io = ALL-UNNAMED设置。如果未指定,将使用默认值true。与ObjectStreamClass相关的内存泄漏在Java 19以后、Java 17.0.4以后和Java 11.0.16以后都得到了修复。在包含修复程序的Java版本上运行时,将禁用该检查。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会尝试清除java.lang.ThreadLocal变量,这些变量已经被web应用程序加载的类填充。如果未指定,将使用默认值true。copyXML如果希望在部署应用程序时将嵌入在应用程序(位于/META-INF/context. XML)中的Context XML复制到所属Host的xmlBase,则设置为true。在随后的启动中,复制的Context XML将优先于应用程序中嵌入的任何Context XML。默认值为false。注意,如果所属Host的deployXML属性为false,或者所属Host的copyXML属性为true,则此属性将不起作用。jndiExceptionOnFailedWrite如果为true,应用程序通过调用bind()、unbind()、createSubContext()、destroySubContext()或close()来修改所提供的JNDI上下文的任何尝试都将触发javax.naming.OperationNotSupportedException,这是Jakarta EE规范的EE.5.3.4节所要求的。可以通过将此属性设置为false禁用此异常,在这种情况下,任何修改JNDI上下文的调用都将返回,而不做任何更改,返回值的方法将返回null。如果没有指定,将使用符合规范的默认值true。renewThreadsWhenStoppingContext如果为true,则当此上下文停止时,Tomcat将更新用于服务此上下文的线程池中的所有线程。这也要求在server.xml中配置threadlocalleakpreventonlistener,并且Executor的threadRenewalDelay属性为>=0。如果未指定,将使用默认值true。skipMemoryLeakChecksOnJvmShutdown如果为true,当web应用程序作为JVM关闭的一部分被停止时,Tomcat将不会执行通常的内存泄漏检查。如果没有指定,将使用默认值false。unloadDelay容器将等待servlet卸载的毫秒数。如果不指定,默认值是2000毫秒。unpackWAR如果为false,则所属主机的unpackWARs属性将被覆盖,WAR文件将不会被解包。如果为true,则所属主机的unpackWARs属性的值将决定WAR是否被解包。如果不指定,默认值为true。useNaming设置为true(默认值)可以让Catalina为这个与Jakarta EE平台约定兼容的web应用程序启用JNDI InitialContext。workDirPathname到该Context提供的临时目录,供相关web应用程序中的servlet临时读写使用。这个目录将通过servlet上下文属性(类型为java.io.File)使web应用程序中的servlet可见,该属性名为jakarta.servlet.context.tempdir,如servlet规范中所述。如果没有指定,将在$CATALINA_BASE/work下面提供一个合适的目录。

属性参考Tomcat10.1

查看原文