Resources 组件

目录

简介

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

资源默认启用缓存。

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

一个 Resources 元素可以嵌套在 Context 组件内部。如果未包含,则会自动创建一个默认的基于文件系统的 Resources,这对于大多数需求来说已足够。

属性

通用属性

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

属性描述
allowLinking

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

注意:在 Windows 平台(或任何其他不区分大小写文件系统的操作系统)上,此标志不得设置为 true,因为它会禁用大小写敏感性检查,从而可能导致 JSP 源代码泄露等安全问题。

archiveIndexStrategy

如果此值为 simple,则将使用哈希映射(hash map)进行 JAR 归档查找,除非在 Context 中明确定义了 useBloomFilterForArchives。

如果此值为 bloom,则将使用布隆过滤器(bloom filter)来加速归档查找。这对于包含大量 JAR 的 Web 应用程序的部署速度可能有所助益。

如果此值为 purged,则将使用布隆过滤器来加速归档查找,但可以在运行时清除。建议使用 bloom 以避免重新初始化布隆过滤器。

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

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 接口。如果未指定,将使用标准值(在下面定义)。

readOnly

如果此标志的值为 true,则将禁用主资源集上的写入。默认值为 false

trackLockedFiles

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

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

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

标准实现

标准根实现

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

提取根实现

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

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

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

嵌套组件

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

预资源(PreResources)

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

属性描述
allowLinking

如果此标志的值为 true,则 Web 资源集内部将允许符号链接,指向 Web 应用程序基本路径内部或外部的资源。如果未指定,该标志的默认值取自外部 Resources 实现。

此属性仅适用于 DirResourceSetFileResourceSet

注意:在 Windows 平台(或任何其他不区分大小写文件系统的操作系统)上,此标志不得设置为 true,因为它会禁用大小写敏感性检查,从而可能导致 JSP 源代码泄露等安全问题。

base

标识要使用的资源所在的位置。此属性是 Tomcat 提供的 org.apache.catalina.WebResourceSet 实现所必需的,应指定资源所在的文件、目录或 JAR 的绝对路径。自定义实现可能不需要此属性。

className

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

internalPath

标识在 基础路径 内查找资源的位置。这通常仅用于 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 资源

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

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

后置资源(Post-resources)

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

排序

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

因此,完整的搜索顺序是:

  • 预资源(PreResources)
  • 主资源(MainResources)
  • 类资源(ClassResources)
  • JAR 资源(JarResources)
  • 后置资源(PostResources)

Web 应用程序启动时类资源和 JAR 资源的填充意味着需要注意正确添加基于 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>

由于这两个资源都是后置资源,可能预期 D:\Projects\external\classes 会在 D:\Projects\lib\library1.jar 之前被搜索类。然而,通过使用 FileResourceSet 添加 JAR,该 JAR 被映射到 /WEB-INF/lib,并将在应用程序启动时与 /WEB-INF/lib 中的其他 JAR 一起处理。JAR 文件中的类将被添加到类资源中,这意味着它们将在 D:\Projects\external\classes 中的类之前被搜索。如果期望的行为是 D:\Projects\external\classesD:\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

缓存策略

通过配置自定义缓存策略,可以对静态资源的缓存获得额外控制。要配置自定义缓存策略,请在 <Resources> 元素内部嵌套一个 <CacheStrategy> 元素,并具有以下属性:

属性描述
className

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

特殊功能

没有与 Resources 元素相关的特殊功能。