Context 容器
目录
简介
以下说明使用变量名 $CATALINA_BASE 来引用大多数相对路径所解析的基础目录。如果你没有通过设置 CATALINA_BASE 目录为多个实例配置 Tomcat,则 $CATALINA_BASE 将被设置为 $CATALINA_HOME 的值,即你已将 Tomcat 安装到的目录。
Context 元素表示一个Web 应用程序,它在特定虚拟主机内运行。每个 Web 应用程序都基于Web 应用程序归档 (WAR) 文件,或包含相应解包内容的对应目录,如 Servlet 规范(版本 2.2 或更高版本)中所述。有关 Web 应用程序归档的更多信息,你可以下载 Servlet 规范,并查看 Tomcat 应用程序开发人员指南。
Catalina 根据将请求 URI 的最长前缀与每个已定义上下文的上下文路径进行匹配,选择用于处理每个 HTTP 请求的 Web 应用程序。一旦选定,该上下文将根据 Web 应用程序部署定义的 servlet 映射,选择一个合适的 servlet 来处理传入的请求。
您可以根据需要定义任意多个上下文元素。每个此类上下文在虚拟主机内必须具有唯一的上下文名称。上下文路径不必唯一(请参见下面的并行部署)。此外,必须存在一个上下文路径等于零长度字符串的上下文。此上下文将成为此虚拟主机的默认 Web 应用程序,并用于处理与任何其他上下文的上下文路径不匹配的所有请求。
并行部署
您可以在同一时间使用相同的上下文路径部署 Web 应用程序的多个版本。用于将请求与上下文版本匹配的规则如下
- 如果请求中不存在会话信息,请使用最新版本。
- 如果请求中存在会话信息,请检查每个版本的会话管理器以查找匹配的会话,如果找到,请使用该版本。
- 如果请求中存在会话信息但找不到匹配的会话,请使用最新版本。
可以通过undeployOldVersions
配置主机,以在不再使用时删除以这种方式部署的旧版本。
命名
当主机执行autoDeploy
或deployOnStartup
操作时,Web 应用程序的名称和上下文路径将从定义 Web 应用程序的文件的名称派生。因此,上下文路径不能在应用程序中嵌入的META-INF/context.xml
中定义,并且上下文名称、上下文路径、上下文版本和基本文件名(名称减去任何.war
或.xml
扩展名)之间存在密切的关系该文件。
如果未指定版本,则上下文名称始终与上下文路径相同。如果上下文路径为空字符串,则基本名称将为 ROOT(始终为大写),否则基本名称将为上下文路径,删除前导“/”并用“#”替换任何剩余的“/”字符。
如果指定了版本,则上下文路径保持不变,并且上下文名称和基本名称都将附加字符串“##”,后跟版本标识符。
下面给出了一些这些命名约定的示例。
上下文路径 | 上下文版本 | 上下文名称 | 基本文件名 | 示例文件名(.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
的版本。
如果您想使用与基本文件名无关的上下文路径部署 WAR 文件或目录,则必须使用以下选项之一来防止重复部署
- 禁用 autoDeploy 和 deployOnStartup,并在 server.xml 中定义所有 Context
- 将 WAR 和/或目录放置在主机的
appBase
之外,并使用带有docBase
属性的 context.xml 文件来定义它。
定义上下文
不建议直接在 server.xml 文件中放置 <Context> 元素。这是因为修改 Context 配置会更具侵入性,因为无法在不重新启动 Tomcat 的情况下重新加载主 conf/server.xml
文件。默认 Context 元素(见下文)还将覆盖直接放置在 server.xml 中的任何 <Context> 元素的配置。为防止这种情况,应将 server.xml 中定义的 <Context> 元素的 override
属性设置为 true
。
可以明确定义各个 Context 元素
- 在应用程序文件中的
/META-INF/context.xml
中的单个文件中。根据主机的 copyXML 属性,可以将其复制到$CATALINA_BASE/conf/[enginename]/[hostname]/
并重命名为应用程序的基本文件名加上 ".xml" 扩展名。 - 在
$CATALINA_BASE/conf/[enginename]/[hostname]/
目录中的单个文件(带有 ".xml" 扩展名)中。上下文路径和版本将从文件的基名(文件名减去 .xml 扩展名)派生。此文件始终优先于打包在 Web 应用程序的 META-INF 目录中的任何 context.xml 文件。 - 在主
conf/server.xml
中的 Host 元素内。
可以定义适用于多个 Web 应用程序的默认 Context 元素。单个 Web 应用程序的配置将覆盖在其中一个默认值中配置的任何内容。在默认 Context 中定义的任何嵌套元素(例如 <Resource> 元素)将为应用默认值的每个 Context 创建一次。它们不会在 Context 元素之间共享。
- 在
$CATALINA_BASE/conf/context.xml
文件中:所有 Web 应用程序都将加载 Context 元素信息。 - 在
$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default
文件中:所有该主机的 Web 应用程序都将加载 Context 元素信息。
除了 server.xml 之外,定义 Context 元素的文件只能定义一个 Context 元素。
除了明确指定的 Context 元素之外,还有几种技术可以自动为您创建 Context 元素。有关更多信息,请参阅 自动应用程序部署 和 用户 Web 应用程序。
要定义使用单个 WAR 文件或目录的多个上下文,请使用上面 命名 部分中描述的选项之一,为 Context 创建一条与基本文件名无关的路径。
属性
通用属性
Context 的所有实现都支持以下属性
属性 | 描述 |
---|---|
allowCasualMultipartParsing |
当调用 HttpServletRequest.getPart* 或 HttpServletRequest.getParameter* 时,如果 Tomcat 应该自动解析 multipart/form-data 请求正文,即使目标 servlet 未标记为 @MultipartConfig 注释(有关详细信息,请参阅 Servlet 规范 3.0,第 3.2 节)。请注意,除了 |
allowMultipleLeadingForwardSlashInPath |
Tomcat 将 URI 中的多个 |
altDDName |
此上下文的备用部署描述符的绝对路径。这将覆盖位于 |
alwaysAccessSession |
如果此值为 如果 |
backgroundProcessorDelay |
此值表示在此上下文及其子容器(包括所有包装器)上调用 backgroundProcess 方法之间以秒为单位的延迟。如果其延迟值不为负(这意味着它们正在使用自己的处理线程),则不会调用子容器。将其设置为正值将导致生成一个线程。在等待指定的时间量后,该线程将在该主机及其所有子容器上调用 backgroundProcess 方法。上下文将使用后台处理来执行会话过期和类监视以进行重新加载。如果未指定,此属性的默认值为 -1,这意味着上下文将依赖其父主机的后台处理线程。 |
className |
要使用的实现的 Java 类名。此类必须实现 |
containerSciFilter |
指定应过滤掉哪些容器提供的 SCI 并不用于此上下文的正则表达式。匹配使用 |
contextGetResourceRequiresSlash |
如果为 如果 |
cookies |
如果希望在客户端支持的情况下使用 cookie 进行会话标识符通信,则设置为 |
createUploadTargets |
如果 Tomcat 应尝试为 Servlet 创建 |
crossContext |
如果希望此应用程序中对 |
dispatcherWrapsSameObject |
如果为 如果 |
docBase |
此 Web 应用程序的文档根目录(也称为上下文根目录),或 Web 应用程序归档文件(如果此 Web 应用程序直接从 WAR 文件执行)的路径名。您可以为此目录或 WAR 文件指定绝对路径名,或相对于所有者 Host 的 除非在 server.xml 中定义了 Context 元素,或者 如果对 |
dispatchersUseEncodedPaths |
控制在调用中用于获取请求分发器时是否需要对路径进行编码。这会影响 Tomcat 处理获取请求分发器的调用方式,以及 Tomcat 在内部生成用于获取请求分发器的路径方式。如果未指定,则使用默认值 |
failCtxIfServletStartFails |
设置为 如果未指定,则使用父级 Host 配置中同名属性(如果已指定)。否则,使用默认值 |
fireRequestListenersOnForwards |
设置为 |
logEffectiveWebXml |
如果希望在应用程序启动时记录用于 Web 应用程序的有效 web.xml(在 INFO 级别),则设置为 |
mapperContextRootRedirectEnabled |
如果启用,则 Mapper 而不是默认 Servlet 将根据需要重定向 Web 应用程序上下文根的请求(添加尾部斜杠)。这效率更高,但会产生确认上下文路径存在的副作用。如果未指定,则使用默认值 |
mapperDirectoryRedirectEnabled |
如果启用,则 Mapper 而不是默认 Servlet 将根据需要重定向 Web 应用程序目录的请求(添加尾部斜杠)。这效率更高,但会产生确认目录存在的副作用。如果未指定,则使用默认值 |
override |
设置为 |
parallelAnnotationScanning |
设置为 |
path |
此 Web 应用程序的上下文路径,它与每个请求 URI 的开头进行匹配,以选择要处理的适当 Web 应用程序。特定 主机 中的所有上下文路径必须唯一。如果您指定一个空字符串 ("") 的上下文路径,则您正在定义此主机的默认 Web 应用程序,它将处理未分配给其他上下文的请求。 此属性只能在 server.xml 中静态定义上下文时使用。在所有其他情况下,路径将从用于 .xml 上下文文件或 即使在 server.xml 中静态定义上下文时,也必须不设置此属性,除非 |
preemptiveAuthentication |
设置为 |
privileged |
设置为 |
reloadable |
如果您希望 Catalina 监视 |
resourceOnlyServlets |
以逗号分隔的 Servlet 名称列表(如 |
sendRedirectBody |
如果为 |
sessionCookieDomain |
用于此上下文创建的所有会话 Cookie 的域。如果设置,这将覆盖 Web 应用程序设置的任何域。如果未设置,将使用 Web 应用程序(如果有)指定的值。 |
sessionCookieName |
用于此上下文创建的所有会话 Cookie 的名称。如果设置,这将覆盖 Web 应用程序设置的任何名称。如果未设置,将使用 Web 应用程序(如果有)指定的值,或者如果 Web 应用程序未明确设置一个名称,则使用名称 |
sessionCookiePath |
用于此上下文创建的所有会话 Cookie 的路径。如果设置,这将覆盖 Web 应用程序设置的任何路径。如果未设置,将使用 Web 应用程序指定的值,或者如果 Web 应用程序未明确设置一个路径,则使用上下文路径。要配置所有 Web 应用程序以使用空路径(这对于端口小程序规范实现可能很有用),请在全局 注意:一旦使用 |
sessionCookiePathUsesTrailingSlash |
某些浏览器,例如 Internet Explorer、Safari 和 Edge,会为路径为 |
suspendWrappedResponseAfterForward |
如果此标志的值为 |
swallowAbortedUploads |
如果 Tomcat 不应该读取已中止上传的任何其他请求正文数据,而应该中止客户端连接,则将其设置为
不读取其他数据将更快地释放请求处理线程。遗憾的是,如果 HTTP 客户端无法写入完整请求,则大多数客户端将不会读取响应。 默认值为 请注意,如果在触发 5xx 响应的请求处理期间发生错误,则将始终忽略任何未读请求数据,并且一旦写入错误响应,客户端连接将关闭。 |
swallowOutput |
如果此标志的值为 |
tldValidation |
如果此标志的值为 |
useBloomFilterForArchives |
已弃用:如果为 如果未指定,则将使用默认值 此值可被 资源 中的 archiveIndexStrategy 覆盖 |
useHttpOnly |
是否应在会话 Cookie 上设置 HttpOnly 标志以防止客户端脚本访问会话 ID?默认为 |
usePartitioned |
是否应在会话 Cookie 上设置 Partitioned 标志?默认为 注意:用于表示分区 Cookie 的属性名称作为 CHIPS 的一部分尚未由 RFC 定义,并且一旦 RFC 中包含等效功能,可能会以不向后兼容的方式进行更改。 |
useRelativeRedirects |
控制由对 |
validateClientProvidedNewSessionId |
当客户端提供新会话的 ID 时,此属性控制是否验证该 ID。使用客户端提供的会话 ID 的唯一用例是在多个 Web 应用程序中使用一个公共会话 ID。因此,任何客户端提供的会话 ID 都应该已经存在于另一个 Web 应用程序中。如果启用此检查,则仅当会话 ID 至少存在于当前主机的另一个 Web 应用程序中时,才会使用客户端提供的会话 ID。请注意,始终应用以下附加测试,无论此设置如何
如果未指定,将使用默认值 |
wrapperClass |
此 Context 管理的 Servlet 将使用的 |
xmlBlockExternal |
如果此标志的值为 |
xmlNamespaceAware |
如果此标志的值为 |
xmlValidation |
如果此标志的值为 |
标准实现
Context 的标准实现是 org.apache.catalina.core.StandardContext。它支持以下附加属性(除了上面列出的常见属性之外)
属性 | 描述 |
---|---|
addWebinfClassesResources |
此属性控制除了从 Web 应用程序 JAR 文件中的 |
antiResourceLocking |
如果为 请注意,将此项设置为 请注意,在主机(默认情况下为 |
clearReferencesHttpClientKeepAliveThread |
如果为 |
clearReferencesObjectStreamClassCaches |
如果为 与 |
clearReferencesRmiTargets |
如果为 |
clearReferencesStopThreads |
如果为 |
clearReferencesStopTimerThreads |
如果为 |
clearReferencesThreadLocals |
如果为 |
copyXML |
如果希望将嵌入在应用程序中的上下文 XML 描述符(位于 |
jndiExceptionOnFailedWrite |
如果为 |
renewThreadsWhenStoppingContext |
如果为 |
skipMemoryLeakChecksOnJvmShutdown |
如果为 |
unloadDelay |
容器将等待 servlet 卸载的毫秒数。如果未指定,默认值为 |
unpackWAR |
如果为 |
useNaming |
设置为 |
workDir |
此上下文提供的临时读写目录的路径名,供关联 Web 应用程序中的 servlet 临时使用。此目录将通过名为 |
嵌套组件
您最多可以嵌套一个实例,方法是在 Context 元素中嵌套一个相应的元素
- Cookie 处理器 - 配置 HTTP cookie 标头的解析和生成。
- 加载器 - 配置将用于加载此 Web 应用程序的 servlet 和 bean 类的 Web 应用程序类加载器。通常,类加载器的默认配置就足够了。
- 管理器 - 配置将用于创建、销毁和持久化此 Web 应用程序的 HTTP 会话的会话管理器。通常,会话管理器的默认配置就足够了。
- 领域 - 配置一个领域,该领域将允许其用户数据库及其关联的角色仅用于此特定 Web 应用程序。如果未指定,此 Web 应用程序将利用与所有 主机 或 引擎 关联的领域。
- 资源 - 配置将用于访问与此 Web 应用程序关联的静态资源的资源管理器。通常,资源管理器的默认配置就足够了。
- WatchedResource - 自动部署器将监视 Web 应用程序的指定静态资源以进行更新,如果更新了资源,它将重新加载 Web 应用程序。此元素的内容必须是字符串。
- JarScanner - 配置将用于扫描 Web 应用程序以查找 JAR 文件和类文件目录的 Jar 扫描器。它通常在 Web 应用程序启动期间用于识别必须作为 Web 应用程序初始化的一部分进行处理的配置文件,例如 TLD 或 web-fragment.xml 文件。通常,默认的 Jar 扫描器配置就足够了。
特殊功能
日志记录
上下文与 org.apache.catalina.core.ContainerBase.[enginename].[hostname].[path]
日志类别相关联。请注意,括号实际上是名称的一部分,不要省略它们。
访问日志
当您运行 Web 服务器时,通常生成的一个输出文件是访问日志,它会为服务器处理的每个请求生成一行信息,采用标准格式。Catalina 包含一个可选的 阀 实现,它可以创建与 Web 服务器创建的相同标准格式的访问日志,或以任意数量的自定义格式创建访问日志。
您可以通过嵌套 阀 元素来要求 Catalina 为 引擎、主机 或 上下文 处理的所有请求创建访问日志,如下所示
<Context>
...
<Valve className="org.apache.catalina.valves.AccessLogValve"
prefix="localhost_access_log" suffix=".txt"
pattern="common"/>
...
</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 来实现您选择的登录方法。
上下文参数
您可以配置命名值,这些值将通过在此元素内嵌套 <Parameter>
元素作为 servlet 上下文初始化参数对 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>
元素的有效属性如下
属性 | 描述 |
---|---|
说明 |
此上下文初始化参数的可选、人类可读说明。 |
名称 |
要创建的上下文初始化参数的名称。 |
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 何时启动或停止的 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“禁止”错误。示例筛选器声明
<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 上下文中链接的全局资源的名称。 |
名称 |
要创建的资源链接的名称,相对于 |
类型 |
Web 应用程序在查找此资源链接时预期的完全限定 Java 类名称。 |
工厂 |
创建这些对象的类的完全限定 Java 类名称。此类应实现 |
当属性factory="org.apache.naming.factory.DataSourceLinkFactory"
时,资源链接可以使用两个附加属性,以允许使用具有不同凭据的共享数据源。当这两个附加属性与javax.sql.DataSource
类型结合使用时,不同的上下文可以使用具有不同凭据的全局数据源。从本质上讲,发生的情况是调用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
上下文中发出getConnection()
请求时,该请求将转换为getConnection("foo","foopass")
,而/bar
中的请求将直接通过。
事务
您可以声明要为java:comp/UserTransaction
的 JNDI 查找返回的 UserTransaction 的特征。您必须定义一个对象工厂类来实例化此对象以及所需的资源参数作为Transaction
元素的属性,以及用于配置该对象工厂的属性。
<Transaction>
元素的有效属性如下
属性 | 描述 |
---|---|
工厂 |
JNDI 对象工厂的类名。 |