资源组件

目录

简介

Resources 元素表示 Web 应用程序可用的所有资源。这包括类、JAR 文件、HTML、JSP 和有助于 Web 应用程序的任何其他文件。提供了实现来使用目录、JAR 文件和 WAR 作为这些资源的来源,并且可以扩展资源实现以提供对以其他形式存储的文件的支持,例如数据库或版本化存储库。

默认情况下,资源会被缓存。

注意:只有当 Web 应用程序不依赖于对其自身资源的直接文件系统访问,并使用 ServletContext 接口中的方法来访问它们时,才能使用基于非文件系统的 Resources 实现运行 Web 应用程序。

Resources 元素可以嵌套在 Context 组件内。如果未包含,将自动创建一个基于文件系统的默认 Resources,这足以满足大多数要求。

属性

通用属性

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

属性 描述
allowLinking

如果此标志的值为 true,则允许在 Web 应用程序内部创建符号链接,指向 Web 应用程序基本路径内或外的资源。如果未指定,则该标志的默认值为 false

注意:此标志在 Windows 平台(或任何其他不区分大小写的文件系统)上不能设置为 true,因为它会禁用区分大小写检查,从而允许 JSP 源代码泄露,以及其他安全问题。

cacheMaxSize

静态资源缓存的最大大小(以千字节为单位)。如果未指定,默认值为 10240(10 MiB)。此值可以在 Web 应用程序运行时更改(例如,通过 JMX)。如果缓存使用的内存大于新限制,缓存将尝试随着时间的推移减小大小以满足新限制。如有必要,cacheObjectMaxSize 将减小,以确保它不超过 cacheMaxSize/20

cacheObjectMaxSize

将放置在缓存中的静态资源的最大大小。如果未指定,默认值为 512(512 千字节)。如果此值大于 cacheMaxSize/20,它将减小到 cacheMaxSize/20。此值可以在 Web 应用程序运行时更改(例如,通过 JMX)。

cacheTtl

缓存条目重新验证之间的时间量(以毫秒为单位)。如果未指定,默认值为 5000(5 秒)。此值可以在 Web 应用程序运行时更改(例如,通过 JMX)。当资源被缓存时,它将继承在被缓存时有效的 TTL,并保留该 TTL,直到资源从缓存中清除,而不管随后对该属性进行的任何更改。

cachingAllowed

如果此标志的值为 true,将使用静态资源的缓存。如果未指定,该标志的默认值为 true。此值可以在 Web 应用程序运行时更改(例如,通过 JMX)。当缓存被禁用时,当前缓存中的任何资源都会从缓存中清除。

className

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

trackLockedFiles

控制是否启用跟踪锁定文件功能。如果启用,所有对返回锁定文件并需要关闭以释放该锁定的对象的方法的调用(例如,ServletContext.getResourceAsStream())都将执行许多其他任务。

  • 将记录调用方法时的堆栈跟踪,并将其与返回的对象关联。
  • 将包装返回的对象,以便可以检测到调用 close()(或等效方法)以释放资源的位置。一旦资源被释放,对对象的跟踪将停止。
  • Web 应用程序关闭时所有剩余的锁定资源都将被记录,然后关闭。

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

archiveIndexStrategy

如果这是simple,那么将使用哈希映射进行 JAR 存档查找,除非在 Context 中明确定义了 useBloomFilterForArchives。

如果这是bloom,那么将使用布隆过滤器来加速存档查找。这可能有利于包含大量 JAR 的 Web 应用程序的部署速度。

如果这是purged,那么将使用布隆过滤器来加速存档查找,但可以在运行时清除。建议使用bloom来避免重新初始化布隆过滤器。

如果未指定,将使用simple的默认值。

标准实现

标准根实现

Resources 的标准实现是 org.apache.catalina.webresources.StandardRoot。它不支持任何其他属性。

提取根实现

Resources 的提取实现是 org.apache.catalina.webresources.ExtractingRoot。它不支持任何其他属性。

在将 Web 应用程序部署为打包的 WAR 文件时,提取根将从 /WEB-INF/lib 中提取任何 JAR 文件到位于 Web 应用程序工作目录中的 application-jars 目录。当 Web 应用程序停止时,将删除这些提取的 JAR。

从打包的 WAR 中提取 JAR 文件可能会提高性能,尤其是在应用程序需要 JAR 扫描时 Web 应用程序启动时。

嵌套组件

Web 应用程序的主要资源由为 Context 定义的 docBase 定义。可以通过定义一个或多个嵌套组件向 Web 应用程序提供其他配置设置和/或资源。

PreResources

在主资源之前搜索 PreResources。将按定义的顺序搜索它们。要配置 PreResources,请在 <Resources> 元素内嵌套一个 <PreResources> 元素,该元素具有以下属性

属性 描述
base

标识要使用的资源所在的位置。Tomcat 提供的 org.apache.catalina.WebResourceSet 实现需要此属性,并且应指定资源所在的 file、directory 或 JAR 的绝对路径。自定义实现可能不需要它。

className

要使用的实现的 Java 类名。此类必须实现 org.apache.catalina.WebResourceSet 接口。Tomcat 提供了三个标准实现:org.apache.catalina.webresources.DirResourceSetorg.apache.catalina.webresources.FileResourceSetorg.apache.catalina.webresources.JarResourceSet。还可以使用自定义实现。

internalPath

标识在其中找到资源的 base 内的路径。这通常仅在资源未位于 JAR 根目录(如资源 JAR 的情况)时与 JAR 文件一起使用。Tomcat 提供的 org.apache.catalina.WebResourceSet 实现需要此属性,并且必须以 '/' 开头。自定义实现可能不需要它。如果未指定,将使用默认值 '/'。

readOnly

如果为 true,则此资源集中的资源可能无法被删除、创建或修改。对于 org.apache.catalina.webresources.JarResourceSet 的实例,此属性被硬编码为 true,且可能无法被更改。对于 org.apache.catalina.webresources.DirResourceSetorg.apache.catalina.webresources.FileResourceSet 的实例,此属性的默认值为 false

webAppMount

标识将这些资源可用的 Web 应用程序中的路径。对于 Tomcat 提供的 org.apache.catalina.WebResourceSet 实现,此属性是必需的,且必须以 '/' 开头。自定义实现可能不需要它。如果未指定,将使用 '/' 的默认值。

JAR 资源

JarResources 在主资源之后但 PostResources 之前进行搜索。它们将按定义的顺序进行搜索。要配置 JarResources,请在 <Resources> 元素内嵌套一个 <JarResources> 元素。配置属性与 PreResources 相同。

在 Web 应用程序启动期间,JAR 扫描过程将检查扫描的 JAR 中 /META-INF/resources 下的内容。如果找到,则此静态内容将被添加到 JarResources。

后置资源

PostResources 在资源 JAR 之后进行搜索。它们将按定义的顺序进行搜索。要配置 PostResources,请在 <Resources> 元素内嵌套一个 <PostResources> 元素。配置属性与 PreResources 相同。

排序

除了上述资源集外,标准实现还维护 ClassResources,它表示映射到 /WEB-INF/classes 的 JAR 文件中包含的类。这允许其他组件通过一次调用来搜索类,而不是一次调用来搜索 /WEB-INF/classes,然后另一次调用来搜索 /WEB-INF/lib 中的 JAR。当 Web 应用程序启动时,ClassResources 会从映射到 /WEB-INF/lib 的 JAR 中填充。

因此,完整的搜索顺序为

  • PreResources
  • MainResources
  • ClassResources
  • JarResources
  • PostResources

在 Web 应用程序启动时填充 ClassResources 和 JarResources,这意味着需要小心地添加基于 JAR 的资源,以获得所需的行为。考虑以下示例

<Resources>
  <PostResources base="D:\Projects\external\classes"
                 className="org.apache.catalina.webresources.DirResourceSet"
                 webAppMount="/WEB-INF/classes"/>
  <PostResources base="D:\Projects\lib\library1.jar"
                 className="org.apache.catalina.webresources.FileResourceSet"
                 webAppMount="/WEB-INF/lib/library1.jar"/>
</Resources>

由于这两个资源都是 PostResources,因此可以预期在 D:\Projects\lib\library1.jar 之前搜索 D:\Projects\external\classes 中的类。但是,通过使用 FileResourceSet 添加 JAR,JAR 会映射到 /WEB-INF/lib,并在应用程序启动时与 /WEB-INF/lib 中的其他 JAR 一起处理。JAR 文件中的类将被添加到 ClassResources,这意味着它们将在 D:\Projects\external\classes 中的类之前进行搜索。如果所需的行为是先搜索 D:\Projects\external\classes,然后再搜索 D:\Projects\lib\library1.jar,则需要稍有不同的配置

<Resources>
  <PostResources base="D:\Projects\external\classes"
                 className="org.apache.catalina.webresources.DirResourceSet"
                 webAppMount="/WEB-INF/classes"/>
  <PostResources base="D:\Projects\lib\library1.jar"
                 className="org.apache.catalina.webresources.JarResourceSet"
                 webAppMount="/WEB-INF/classes"/>
</Resources>

简而言之,JAR 文件应作为映射到 /WEB-INF/classesJarResourceSet 添加,而不是使用映射到 /WEB-INF/libFileResourceSet

缓存策略

通过配置自定义缓存策略,可以获得对静态资源缓存的更多控制。要配置自定义缓存策略,请将 <CacheStrategy> 元素嵌套在 <Resources> 元素中,并使用以下属性

属性 描述
className

要使用的实现的 Java 类名。此类必须实现 org.apache.catalina.WebResourceRoot$CacheStrategy 接口。

特殊功能

Resources 元素不具有任何特殊功能。