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 执行 autoDeploy
或 deployOnStartup
操作时,Web 应用程序的名称和 context path 是从定义该 Web 应用程序的文件名中派生的。因此,context path 可能不能在嵌入在应用程序中的 META-INF/context.xml
中定义,并且context 名称、context path、context 版本以及文件的基本文件名(减去任何 .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 节),则设置为 |
allowMultipleLeadingForwardSlashInPath |
Tomcat 会将 URI 中多个 |
altDDName |
此 context 的替代部署描述符的绝对路径。这会覆盖位于 |
alwaysAccessSession |
如果此值为 如果 |
backgroundProcessorDelay |
此值表示在此 context 及其子容器(包括所有包装器)上调用 backgroundProcess 方法之间的延迟(秒)。如果子容器的延迟值不为负(这意味着它们正在使用自己的处理线程),则不会调用它们。将其设置为正值将导致生成一个线程。在等待指定时间后,该线程将在此 Host 及其所有子容器上调用 backgroundProcess 方法。Context 将使用后台处理来执行会话过期和类监视以进行重新加载。如果未指定,此属性的默认值为 -1,这意味着 context 将依赖于其父 Host 的后台处理线程。 |
className |
要使用的实现的 Java 类名。此G类必须实现 |
containerSciFilter |
用于指定应过滤掉哪些容器提供的 SCI 且不在此 context 中使用的正则表达式。匹配使用 |
contextGetResourceRequiresSlash |
如果此值为 如果 |
cookies |
如果客户端支持使用 Cookie 进行会话标识符通信(这是默认值),则设置为 |
createUploadTargets |
如果 Tomcat 应该尝试为 Servlet 创建 |
crossContext |
如果希望此应用程序内对 |
dispatcherWrapsSameObject |
如果此值为 如果 |
dispatchersUseEncodedPaths |
控制获取请求调度器调用中使用的路径是否期望被编码。这会影响 Tomcat 如何处理获取请求调度器的调用,以及 Tomcat 如何在内部生成用于获取请求调度器的路径。如果未指定,将使用默认值 |
docBase |
此 Web 应用程序的文档基准(也称为上下文根目录)目录,或 Web 应用程序归档文件的路径名(如果此 Web 应用程序直接从 WAR 文件执行)。您可以为该目录或 WAR 文件指定绝对路径名,或指定相对于所属 Host 的 除非 Context 元素在 server.xml 中定义,或 如果 |
encodedReverseSolidusHandling |
设置为 如果使用 如果未指定,默认值为 |
encodedSolidusHandling |
设置为 如果使用 如果未指定,默认值为 |
failCtxIfServletStartFails |
如果任何 如果未指定,如果父 Host 配置中指定了同名属性,则使用其值。否则,将使用默认值 |
fireRequestListenersOnForwards |
设置为 |
ignoreAnnotations |
设置为 如果未指定,将使用默认值 |
logEffectiveWebXml |
如果希望 Web 应用程序使用的有效 web.xml 在应用程序启动时被记录(INFO 级别),则设置为 |
mapperContextRootRedirectEnabled |
如果启用,Web 应用程序 context root 的请求将由 Mapper(而非默认 Servlet)在必要时进行重定向(添加尾部斜杠)。这更高效,但存在安全副作用。首先,即使用户无权访问该目录,Web 应用程序或目录的存在也可能被确认。其次,任何 Valve 和/或 Filter(包括提供安全功能的那些)将没有机会处理请求。如果未指定,将使用默认值 |
mapperDirectoryRedirectEnabled |
如果启用,Web 应用程序目录的请求将由 Mapper(而非默认 Servlet)在必要时进行重定向(添加尾部斜杠)。这更高效,但存在安全副作用。首先,即使用户无权访问该目录,Web 应用程序或目录的存在也可能被确认。其次,任何 Valve 和/或 Filter(包括提供安全功能的那些)将没有机会处理请求。如果未指定,将使用默认值 |
override |
设置为 |
parallelAnnotationScanning |
设置为 |
path |
此 Web 应用程序的context path,它与每个请求 URI 的开头匹配,以选择合适的 Web 应用程序进行处理。特定 Host 内的所有 context path 都必须是唯一的。如果您指定一个空字符串 (“”) 作为 context path,则表示您正在定义此 Host 的默认 Web 应用程序,它将处理所有未分配给其他 Context 的请求。 此属性只能在 server.xml 中静态定义 Context 时使用。在所有其他情况下,路径将从用于 .xml context 文件或 即使在 server.xml 中静态定义 Context 时,除非 |
preemptiveAuthentication |
设置为 |
privileged |
设置为 |
reloadable |
如果您希望 Catalina 监视 |
resourceOnlyServlets |
逗号分隔的 Servlet 名称列表(如 |
sendRedirectBody |
如果为 |
sessionCookieDomain |
用于此 context 创建的所有会话 Cookie 的域。如果设置,此值将覆盖 Web 应用程序设置的任何域。如果未设置,将使用 Web 应用程序指定的值(如果有)。 |
sessionCookieName |
用于此 context 创建的所有会话 Cookie 的名称。如果设置,此值将覆盖 Web 应用程序设置的任何名称。如果未设置,将使用 Web 应用程序指定的值(如果有),或者如果 Web 应用程序未显式设置,则使用名称 |
sessionCookiePath |
用于此 context 创建的所有会话 Cookie 的路径。如果设置,此值将覆盖 Web 应用程序设置的任何路径。如果未设置,将使用 Web 应用程序指定的值,或者如果 Web 应用程序未显式设置,则使用 context path。要将所有 Web 应用程序配置为使用空路径(这对于 portlet 规范实现可能很有用),请在全局 注意:一旦一个使用 |
sessionCookiePathUsesTrailingSlash |
一些浏览器(如 Internet Explorer、Safari 和 Edge)在请求 |
suspendWrappedResponseAfterForward |
如果此标志的值为 |
swallowAbortedUploads |
如果 Tomcat 不读取中止上传的任何额外请求体数据,而是中止客户端连接,则设置为
不读取额外数据将更快地释放请求处理线程。不幸的是,大多数 HTTP 客户端如果无法写入完整的请求,将不会读取响应。 默认值为 请注意,如果在请求处理期间发生错误并触发 5xx 响应,则任何未读的请求数据都将被忽略,并且一旦错误响应被写入,客户端连接将关闭。 |
swallowOutput |
如果此标志的值为 |
tldValidation |
如果此标志的值为 |
useHttpOnly |
是否应在会话 Cookie 上设置 HttpOnly 标志,以防止客户端脚本访问会话 ID?默认值为 |
usePartitioned |
是否应在会话 Cookie 上设置 Partitioned 标志?默认值为 注意:用于指示作为 CHIPS 一部分的区分式 Cookie 的属性名称未由 RFC 定义,并且一旦等效功能包含在 RFC 中,可能会以不向后兼容的方式更改。 |
useRelativeRedirects |
控制调用 |
validateClientProvidedNewSessionId |
当客户端为新会话提供 ID 时,此属性控制该 ID 是否经过验证。使用客户端提供的会话 ID 的唯一用例是在多个 Web 应用程序之间拥有一个共同的会话 ID。因此,任何客户端提供的会话 ID 都应该已存在于另一个 Web 应用程序中。如果启用此检查,则仅当会话 ID 存在于当前 Host 的至少一个其他 Web 应用程序中时,才使用客户端提供的会话 ID。请注意,无论此设置如何,以下附加测试始终适用:
如果未指定,将使用默认值 |
wrapperClass |
将用于此 Context 管理的 servlet 的 |
xmlBlockExternal |
如果此标志的值为 |
xmlNamespaceAware |
如果此标志的值为 |
xmlValidation |
如果此标志的值为 |
标准实现
Context 的标准实现是 org.apache.catalina.core.StandardContext。它支持以下附加属性(除了上面列出的通用属性):
属性 | 描述 |
---|---|
addWebinfClassesResources |
此属性控制除了从 Web 应用程序 JAR 文件内部的 |
antiResourceLocking |
如果为 请注意,将其设置为 请注意,在 Host 的 |
clearReferencesHttpClientKeepAliveThread |
如果为 |
clearReferencesRmiTargets |
如果为 |
clearReferencesStopThreads |
如果为 |
clearReferencesStopTimerThreads |
如果为 |
clearReferencesThreadLocals |
如果为 |
copyXML |
如果希望嵌入在应用程序内部(位于 |
jndiExceptionOnFailedWrite |
如果为 |
notFoundClassResourceCacheSize |
类资源不被标准资源实现缓存,因为它们在首次使用时加载,然后就不再需要该资源了。然而,缓存未找到的类确实有帮助,因为在某些情况下,同一个类会被多次搜索,并且 JAR/类的数量越多,搜索时间就越长。使用 LRU 缓存,此属性控制该缓存的大小。小于 1 的值将禁用缓存。如果未指定,将使用默认值 1000。 |
renewThreadsWhenStoppingContext |
如果为 |
skipMemoryLeakChecksOnJvmShutdown |
如果为 |
unloadDelay |
容器等待 servlet 卸载的毫秒数。如果未指定,默认值为 |
unpackWAR |
如果为 |
useNaming |
设置为 |
workDir |
此 Context 为相关 Web 应用程序中的 servlet 提供的临时读写使用的暂存目录路径名。此目录将通过名为 |
嵌套组件
您可以通过在 Context 元素内部嵌套相应的元素,最多嵌套以下实用组件的一个实例:
- Cookie 处理器 - 配置 HTTP Cookie 头部的解析和生成。
- 加载器 - 配置将用于加载此 Web 应用程序的 servlet 和 bean 类的 Web 应用程序类加载器。通常,类加载器的默认配置就足够了。
- 管理器 - 配置将用于为此 Web 应用程序创建、销毁和持久化 HTTP 会话的会话管理器。通常,会话管理器的默认配置就足够了。
- Realm - 配置一个 Realm,允许其用户数据库及其关联角色仅用于此特定 Web 应用程序。如果未指定,此 Web 应用程序将使用与所属 Host 或 Engine 关联的 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 元素,为由 Engine、Host 或 Context 处理的所有请求创建访问日志:
<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 应用程序部署描述符中找到的同名 |
值 |
当应用程序通过调用 |
环境条目
您可以通过在此元素内部嵌套 <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>
元素的有效属性如下:
属性 | 描述 |
---|---|
描述 |
可选,此环境条目的人类可读描述。 |
名称 |
要创建的环境条目的名称,相对于 |
override |
如果您不希望 Web 应用程序部署描述符中找到的同名 |
类型 |
Web 应用程序为此环境条目期望的完全限定 Java 类名。必须是 Web 应用程序部署描述符中 |
值 |
当从 JNDI context 请求时,将呈现给应用程序的参数值。此值必须可转换为 |
生命周期监听器
如果您实现了一个需要知道此 Context 何时启动或停止的 Java 对象,您可以通过在此元素内部嵌套一个 Listener 元素来声明它。您指定的类名必须实现 org.apache.catalina.LifecycleListener
接口,并且该类必须打包成 jar 并放置在 $CATALINA_HOME/lib
目录中。它将收到相应生命周期事件发生的通知。此类监听器的配置如下所示:
<Context>
...
<Listener className="com.mycompany.mypackage.MyListener" ... >
...
</Context>
请注意,监听器可以有任意数量的附加属性,这些属性可以从该元素配置。属性名称使用标准属性方法命名模式与相应的 JavaBean 属性名称匹配。
请求过滤器
您可以要求 Catalina 检查指向周围 Engine、Host 或 Context 元素的每个传入请求的 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 应用程序代码是否以编程方式登录到相应的资源管理器,或者容器是否代表应用程序登录到资源管理器。此属性的值必须为 |
closeMethod |
当不再需要单例资源时,要调用的零参数方法的名称。这旨在加速资源的清理,否则这些清理将作为垃圾回收的一部分发生。如果 对于实现 |
描述 |
可选,此资源的人类可读描述。 |
名称 |
要创建的资源的名称,相对于 |
范围 |
指定通过此资源管理器获取的连接是否可以共享。此属性的值必须为 |
单例 |
指定此资源定义是否适用于单例资源,即资源只有一个实例。如果此属性为 |
类型 |
当 Web 应用程序对此资源执行查找时,期望的完全限定 Java 类名。 |
资源链接
此元素用于创建指向全局 JNDI 资源的链接。对链接名称执行 JNDI 查找将返回链接的全局资源。
例如,您可以像这样创建一个资源链接:
<Context>
...
<ResourceLink name="linkToGlobalResource"
global="simpleValue"
type="java.lang.Integer"
...
</Context>
<ResourceLink>
元素的有效属性如下:
属性 | 描述 |
---|---|
全局 |
全局 JNDI context 中链接的全局资源的名称。 |
名称 |
要创建的资源链接的名称,相对于 |
类型 |
当 Web 应用程序对此资源链接执行查找时,期望的完全限定 Java 类名。 |
工厂 |
创建这些对象的类的完全限定 Java 类名。此G类应该实现 |
当属性 factory="org.apache.naming.factory.DataSourceLinkFactory"
时,资源链接可以与两个附加属性一起使用,以允许共享数据源与不同的凭据一起使用。当这两个附加属性与 javax.sql.DataSource
类型结合使用时,不同的 context 可以使用不同的凭据共享全局数据源。在幕后,对 getConnection()
的调用被简单地转换为对全局数据源的 getConnection(username, password)
调用。这是一种使代码对正在使用的架构透明,但又能够在全局配置中控制连接(或连接池)的简单方法。
属性 | 描述 |
---|---|
用户名 |
链接的全局 DataSource 上 |
密码 |
链接的全局 DataSource 上 |
共享数据源示例
警告:此功能仅在全局 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 对象工厂的类名。 |