Tomcat的配置檔案中有哪些關鍵的配置項,它們分別有什麼作用?

威哥爱编程發表於2024-08-26

Tomcat的配置檔案主要包括server.xmlweb.xml,它們位於Tomcat安裝目錄下的conf資料夾中。今天的內容重點介紹 server.xml 檔案的配置,V 哥會結合一些業務場景來介紹,希望可以幫助到你,以下是一些關鍵的配置項及其作用:

server.xml中的配置項:

  1. <Server>: 根元素,定義了Tomcat伺服器的配置。

    • port: 用於設定Tomcat伺服器的埠,預設是8005。
  2. <Service>: 定義服務的元素,包含一個或多個<Connector><Engine>

    • name: 服務的名稱。
    • port: 服務監聽的埠。
  3. <Connector>: 定義HTTP連線的配置。

    • port: HTTP連線的埠,預設是8080。
    • protocol: 連線使用的協議,如HTTP/1.1。
    • redirectPort: 當使用SSL時,非SSL請求被重定向到的埠。
  4. <Engine>: 定義引擎的配置,引擎是Tomcat的元件,用於路由請求到相應的<Host>

    • defaultHost: 預設主機名。
  5. <Host>: 定義虛擬主機的配置。

    • name: 虛擬主機的名稱,可以是域名或IP地址。
    • appBase: 應用程式的基礎目錄。
    • unpackWAR: 是否解壓WAR檔案。
  6. <Context>: 定義Web應用程式的上下文配置。

    • path: Web應用程式的路徑。
    • docBase: Web應用程式的基礎目錄或WAR檔案的路徑。
    • reloadable: 是否允許重新載入應用程式。
  7. <Listener>: 定義伺服器監聽器,用於執行啟動和停止操作。

  8. <Realm>: 定義安全域,用於認證和授權。

  9. <Valve>: 定義請求處理過程中的閥門,可以攔截或處理請求。

1. <server>

<Server>元素是Tomcat配置檔案server.xml中的根元素,它包含了整個Tomcat伺服器的配置資訊。以下是一些具體的業務場景和相應的<Server>配置示例:

場景1:開發環境

在開發環境中,我們通常希望Tomcat伺服器能夠快速重啟以便於開發和測試。因此,可以配置較短的JVM暫停時間,以便在發生錯誤時快速響應。

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.startup.ContextConfig" />
  <Listener className="org.apache.catalina.startup.UserDataConfig" />
  <GlobalNamingResources>
    <!-- 配置資源 -->
  </GlobalNamingResources>
</Server>

場景2:生產環境

在生產環境中,穩定性和安全性是首要考慮的因素。因此,可能需要配置更長的JVM暫停時間來減少重啟次數,同時配置SSL證書以支援HTTPS。

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <!-- 其他監聽器配置 -->
  <GlobalNamingResources>
    <!-- 配置SSL證書 -->
    <Resource name="UserDatabase" auth="Container"
      type="org.apache.catalina.UserDatabase"
      description="User database that can be updated and saved"
      factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
      pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <!-- 配置SSL聯結器 -->
  <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
             scheme="https" secure="true" SSLEnabled="true"
             keystoreFile="/path/to/keystore.jks" keystorePass="password" />
</Server>

場景3:負載均衡

如果Tomcat伺服器作為負載均衡叢集的一部分,可能需要配置特定的埠用於叢集通訊,例如使用Tomcat的叢集部署協議。

<Server port="8005" shutdown="SHUTDOWN">
  <!-- 配置叢集監聽器 -->
  <Listener className="org.apache.catalina.ha.session.JvmRouteBinderListener" />
  <GlobalNamingResources>
    <!-- 配置叢集相關資源 -->
  </GlobalNamingResources>
  <!-- 配置服務和引擎 -->
  <Service name="CatalinaCluster">
    <Engine name="clusterEngine" defaultHost="localhost" jvmRoute="jvm1">
      <!-- 配置Connector和Host -->
    </Engine>
  </Service>
</Server>

場景4:多例項部署

在需要在同一臺伺服器上部署多個Tomcat例項的場景中,可以為每個例項配置不同的<Server>埠。

<Server port="8006" shutdown="SHUTDOWN">
  <!-- 配置第一個Tomcat例項的監聽器和資源 -->
</Server>
<Server port="8007" shutdown="SHUTDOWN">
  <!-- 配置第二個Tomcat例項的監聽器和資源 -->
</Server>

2. <Service>

<Service>元素在Tomcat的server.xml配置檔案中定義了一個服務,它將一個或多個聯結器(<Connector>)與一個引擎(<Engine>)關聯起來。以下是根據不同業務場景的<Service>配置示例:

場景1:單例項應用

對於大多數基本應用,您可能只需要一個服務例項來處理所有的HTTP請求。以下是一個基本的<Service>配置:

<Service name="Catalina">
  <Connector port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />
  <Engine name="Catalina" defaultHost="localhost">
    <!-- 其他配置,如Host等 -->
  </Engine>
</Service>

場景2:支援SSL的HTTPS服務

如果您的應用需要透過HTTPS提供安全連線,您需要配置一個支援SSL的<Connector>

<Service name="Catalina">
  <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
             SSLEnabled="true"
             keystoreFile="/path/to/your.keystore"
             keystorePass="your_keystore_password"
             scheme="https" secure="true" />
  <Engine name="Catalina" defaultHost="localhost">
    <!-- 其他配置 -->
  </Engine>
</Service>

場景3:負載均衡

在負載均衡場景中,您可能需要多個服務例項來處理請求。每個服務可以繫結到不同的埠,並配置為處理不同型別的請求:

<Service name="CatalinaCluster">
  <Connector port="8080" protocol="HTTP/1.1" redirectPort="8443" />
  <Engine name="Catalina" defaultHost="loadbalancer" jvmRoute="node1">
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />
    <Host name="loadbalancer" appBase="webapps" unpackWARs="true" autoDeploy="true">
      <!-- 負載均衡器的配置 -->
    </Host>
  </Engine>
</Service>

場景4:多個Web應用

如果您需要在同一臺伺服器上執行多個Web應用,可以為每個應用配置不同的<Service>

<Service name="Catalina1">
  <Connector port="8081" protocol="HTTP/1.1" />
  <Engine name="Catalina1" defaultHost="app1.example.com">
    <Host name="app1.example.com" appBase="webapp1" unpackWARs="true" autoDeploy="true">
      <!-- 應用1的配置 -->
    </Host>
  </Engine>
</Service>

<Service name="Catalina2">
  <Connector port="8082" protocol="HTTP/1.1" />
  <Engine name="Catalina2" defaultHost="app2.example.com">
    <Host name="app2.example.com" appBase="webapp2" unpackWARs="true" autoDeploy="true">
      <!-- 應用2的配置 -->
    </Host>
  </Engine>
</Service>

場景5:高可用性配置

在需要高可用性的業務場景中,可以配置多個服務例項,每個例項執行在不同的埠上,並透過叢集管理器進行管理:

<Service name="CatalinaHA">
  <Connector port="8080" protocol="HTTP/1.1" redirectPort="8443" />
  <Engine name="Catalina" defaultHost="app.example.com" jvmRoute="node1">
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
      <Channel className="org.apache.catalina.ha.tcp.ReplicationChannel">
        <Member className="org.apache.catalina.ha.tcp.ReplicationMember"
                host="node2"
                port="4000" />
      </Channel>
    </Cluster>
    <Host name="app.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
      <!-- 高可用性應用的配置 -->
    </Host>
  </Engine>
</Service>

3. <Connector>

<Connector>元素在Tomcat的server.xml配置檔案中定義了伺服器的網路連線引數,它用於處理客戶端的HTTP請求。以下是根據不同業務場景的<Connector>配置示例:

場景1:HTTP服務

對於基本的HTTP服務,您需要配置一個標準的HTTP聯結器:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
  • port: 設定HTTP服務監聽的埠。
  • protocol: 指定使用的協議,這裡使用Tomcat的HTTP/1.1處理器。
  • connectionTimeout: 請求超時時間(毫秒)。
  • redirectPort: 當客戶端使用HTTP請求時,重定向到的HTTPS埠。

場景2:HTTPS服務

如果您的應用需要透過HTTPS提供加密連線,您需要配置一個支援SSL的聯結器:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           connectionTimeout="20000"
           scheme="https" secure="true"
           SSLEnabled="true"
           keystoreFile="conf/keystore.jks"
           keystorePass="changeit" />
  • scheme: 設定為https表示使用安全的連線。
  • secure: 設定為true表示請求需要安全連線。
  • SSLEnabled: 設定為true以啟用SSL。
  • keystoreFile: 指定包含SSL證書的金鑰庫檔案路徑。
  • keystorePass: 金鑰庫的密碼。

場景3:效能最佳化

對於需要處理大量併發請求的應用,可以配置NIO(非阻塞I/O)或NIO2的聯結器來提高效能:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
           connectionTimeout="20000"
           maxThreads="150" minSpareThreads="25"
           acceptCount="100" />
  • maxThreads: 最大工作執行緒數。
  • minSpareThreads: 保持執行的最小空閒執行緒數。
  • acceptCount: 可以接受的請求佇列長度。

場景4:限制請求大小

為了防止伺服器被大檔案上傳拖慢,可以限制請求的最大大小:

<Connector port="8080" protocol="HTTP/1.1"
           maxPostSize="20971520" />
  • maxPostSize: 最大POST請求大小,這裡設定為20MB。

場景5:啟用GZIP壓縮

為了減少網路傳輸的資料量,可以配置聯結器以啟用GZIP壓縮:

<Connector port="8080" protocol="HTTP/1.1"
           compression="on"
           compressionMinSize="2048"
           noCompressionUserAgent="gozilla, traviata" />
  • compression: 設定為on以啟用壓縮。
  • compressionMinSize: 啟用壓縮的請求最小大小(位元組)。
  • noCompressionUserAgent: 不應用壓縮的瀏覽器列表。

場景6:配置代理設定

如果您的Tomcat伺服器位於一個或多個代理之後,您可能需要配置聯結器以正確處理請求頭:

<Connector port="8080" protocol="HTTP/1.1"
           proxyName="www.example.com"
           proxyPort="80"
           scheme="http"
           secure="false" />
  • proxyName: 代理伺服器的主機名。
  • proxyPort: 代理伺服器監聽的埠。

4. <Engine>

<Engine>元素在Tomcat的server.xml配置檔案中代表了一個請求引擎,它負責接收<Service>中的<Connector>轉發的請求,並將請求路由到相應的<Host><Context>。以下是根據不同業務場景的<Engine>配置示例:

場景1:基本Web應用路由

對於基本的Web應用部署,您可能只需要將請求路由到預設的虛擬主機:

<Engine name="Catalina" defaultHost="localhost">
  <Realm className="org.apache.catalina.realm.LockOutRealm" />
  <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <!-- 可以包含具體的<Context>元素定義 -->
  </Host>
</Engine>
  • name: 引擎的名稱,通常與<Service>元素的名稱相匹配。
  • defaultHost: 請求無法匹配到任何<Host>時使用的預設主機名。

場景2:部署多個虛擬主機

如果您需要在同一臺伺服器上部署多個虛擬主機,可以在同一個<Engine>下配置多個<Host>

<Engine name="Catalina" defaultHost="default">
  <Host name="app1.example.com" appBase="webapps/app1" unpackWARs="true" autoDeploy="true">
    <!-- 應用1的配置 -->
  </Host>
  <Host name="app2.example.com" appBase="webapps/app2" unpackWARs="true" autoDeploy="true">
    <!-- 應用2的配置 -->
  </Host>
</Engine>

場景3:叢集部署

在需要高可用性的叢集部署場景中,可以配置叢集管理器來同步會話資訊:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
    <Channel className="org.apache.catalina.ha.tcp.ReplicationChannel">
      <Member className="org.apache.catalina.ha.tcp.ReplicationMember"
              host="node2"
              port="4000" />
    </Channel>
  </Cluster>
  <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <!-- 主機配置 -->
  </Host>
</Engine>
  • jvmRoute: 當前例項的JVM路由標識,用於叢集中的會話查詢。

場景4:自定義請求過濾器

如果您需要對所有請求應用自定義過濾器,可以在<Engine>下配置<Valve>

<Engine name="Catalina" defaultHost="localhost">
  <Valve className="com.example.MyCustomRequestFilter" />
  <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <!-- 主機配置 -->
  </Host>
</Engine>
  • className: 指定自定義過濾器的完整類名。

場景5:訪問日誌配置

為了記錄所有請求的訪問日誌,可以在<Engine>下配置訪問日誌閥:

<Engine name="Catalina" defaultHost="localhost">
  <Realm className="org.apache.catalina.realm.LockOutRealm" />
  <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <!-- 主機配置 -->
  </Host>
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
         prefix="access_log." suffix=".txt" pattern="common" rotate="true" />
</Engine>
  • directory: 訪問日誌檔案儲存的目錄。
  • prefixsuffix: 日誌檔案的字首和字尾。
  • pattern: 日誌記錄的格式。
  • rotate: 是否啟用日誌輪轉。

5. <Host>

<Host>元素在Tomcat的server.xml配置檔案中配置了一個虛擬主機,它處理指向特定主機名或IP地址的請求。以下是根據不同業務場景的<Host>配置示例:

場景1:單個應用的虛擬主機

對於單個應用的部署,您可以配置一個虛擬主機,所有請求都會對映到這個應用:

<Host name="myapp.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <!-- 應用的Context配置可以在這裡新增,或者在單獨的XML檔案中配置 -->
</Host>
  • name: 虛擬主機的名稱,通常是應用的域名。

場景2:多個應用的虛擬主機

如果您希望一個虛擬主機管理多個應用,可以在<Host>下配置多個<Context>

<Host name="multiapp.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Context path="/app1" docBase="app1" />
  <Context path="/app2" docBase="app2" />
  <!-- 更多應用的Context配置 -->
</Host>
  • path: Web應用的路徑。
  • docBase: Web應用的文件基礎路徑或WAR檔名。

場景3:使用外部定義的Context

在複雜的部署場景中,您可能希望將<Context>配置在外部XML檔案中,以保持server.xml的清晰:

<Host name="externalctx.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Context path="" docBase="external" reloadable="true" />
  <!-- 其他Context配置 -->
</Host>
  • <Context>path可以留空,表示應用的根路徑。
  • docBase可以指向包含context.xml檔案的目錄。

場景4:配置別名

如果您希望虛擬主機響應多個域名,可以使用<Alias>元素:

<Host name="alias.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Alias>www.alias.com</Alias>
  <!-- 應用的Context配置 -->
</Host>
  • <Alias>: 虛擬主機的另一個域名。

場景5:配置SSL

對於需要SSL加密的虛擬主機,可以配置一個SSL聯結器,並在<Host>中指定SSL相關屬性:

<Host name="secure.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true"
      sslProtocol="TLS" sslCertificateFile="/path/to/certificate.cer"
      sslCertificateKeyFile="/path/to/key.key" sslPort="8443">
  <!-- 應用的Context配置 -->
</Host>
  • sslProtocol: 使用的SSL協議。
  • sslCertificateFilesslCertificateKeyFile: SSL證書和私鑰檔案的路徑。
  • sslPort: SSL埠,當客戶端透過這個埠訪問時,將使用SSL。

場景6:禁用某些HTTP方法

出於安全考慮,您可能希望禁用某些HTTP方法:

<Host name="securemethods.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Valve className="org.apache.catalina.valves.AccessLogValve" 
         pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  <Context>
    <Valve className="org.apache.catalina.valves.MethodDisablerValve" methods="TRACE" />
  </Context>
</Host>
  • methods: 需要禁用的HTTP方法列表。

6. <Context>

<Context>元素在Tomcat的server.xml配置檔案中定義了Web應用程式的上下文。每個<Context>代表一個Web應用,包括它的路徑、文件基礎、會話管理和其他特定於應用的設定。以下是根據不同業務場景的<Context>配置示例:

場景1:基本Web應用部署

對於基本的Web應用部署,您需要指定應用的路徑和文件基礎:

<Context path="/myapp" docBase="myapp" />
  • path: Web應用的URL路徑。
  • docBase: Web應用的目錄或WAR檔案的名稱。

場景2:配置外部WAR檔案

如果您有一個外部WAR檔案,希望部署為特定的上下文路徑:

<Context path="/externalapp" docBase="/path/to/externalapp.war" />
  • docBase: 指向外部WAR檔案的絕對路徑。

場景3:使用相對路徑的WAR檔案

在某些情況下,您可能希望使用相對於appBase的相對路徑:

<Context path="/relapp" docBase="webapps/relapp.war" />

場景4:配置會話超時

為了管理會話的生命週期,您可以設定會話超時時間(以分鐘為單位):

<Context path="/myapp" docBase="myapp" sessionTimeout="30" />

場景5:啟用應用的重新載入

在開發過程中,您可能希望在程式碼更改後自動重新載入應用:

<Context path="/devapp" docBase="devapp" reloadable="true" />
  • reloadable: 設定為true以啟用應用的自動重新載入。

場景6:配置資源連結

如果您的應用需要連線到外部資源(如資料庫),您可以配置資源連結:

<Context path="/myapp" docBase="myapp">
  <ResourceLink global="jdbc/myDB" type="javax.sql.DataSource"
                name="jdbc/myAppDB" />
</Context>
  • ResourceLink: 定義了一個資源連結,允許應用訪問在<GlobalNamingResources>中定義的資源。

場景7:配置安全設定

對於需要安全認證的應用,您可以配置安全約束和角色:

<Context path="/secapp" docBase="secapp">
  <SecurityConstraint>
    <WebResourceCollection urlPattern="/*">
      <HttpMethod constraint="POST,PUT" />
    </WebResourceCollection>
    <AuthConstraint>
      < Role name="admin" />
    </AuthConstraint>
  </SecurityConstraint>
  <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
</Context>
  • SecurityConstraint: 定義了哪些資源需要安全保護。
  • WebResourceCollection: 定義了受保護的URL模式和HTTP方法。
  • AuthConstraint: 定義了允許訪問的的角色。
  • Valve: 指定了認證的型別(例如,基本認證)。

場景8:配置字符集和本地化

為了確保應用正確處理國際化內容,您可以配置字符集和本地化:

<Context path="/globalapp" docBase="globalapp" useHttpOnly="true">
  <LocaleConfig defaultLocale="en" />
  <CharsetConfig>
    <Charset name="UTF-8" />
  </CharsetConfig>
</Context>
  • useHttpOnly: 設定為true以啟用HttpOnly Cookies。
  • LocaleConfig: 定義了預設地區設定。
  • CharsetConfig: 定義了應用使用的字符集。

7. <Listener>

<Listener>元素在Tomcat的server.xml配置檔案中用於註冊事件監聽器,這些監聽器在Tomcat的生命週期事件(如啟動和停止)發生時被呼叫。以下是根據不同業務場景的<Listener>配置示例:

場景1:自定義上下文初始化

如果您需要在Tomcat啟動時執行自定義邏輯,比如初始化資料庫連線池或載入應用程式特定的資源,可以定義一個自定義的上下文監聽器:

<Listener className="com.example.MyContextListener" />
  • className: 指定自定義監聽器的完整類名。

場景2:SSL證書管理

在需要動態載入或重新整理SSL證書的業務場景中,可以使用自定義的證書管理監聽器:

<Listener className="com.example.SSLCertLoader" />

場景3:叢集會話管理

當Tomcat配置為叢集模式時,可以使用特定的監聽器來管理會話複製:

<Listener className="org.apache.catalina.ha.session.JvmRouteBinderListener" />
  • 這個監聽器是Tomcat叢集會話管理的一部分,用於設定JVM路由。

場景4:請求日誌記錄

為了記錄所有進入Tomcat的請求,可以配置請求日誌監聽器:

<Listener className="org.apache.catalina.core.AsyncListenerWrapper" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="access_log" suffix=".txt" pattern="common" resolveHosts="false" />
  • AccessLogValve: 用於記錄訪問日誌的監聽器,可以設定日誌的目錄、字首、字尾和日誌模式。

場景5:效能監控

為了監控Tomcat的效能,可以新增效能監控監聽器:

<Listener className="com.example.PerformanceMonitor" />

場景6:Tomcat資源管理

Tomcat的資源管理監聽器可以用於跟蹤和管理JNDI資源:

<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

場景7:自定義使用者資料管理

如果您需要在Tomcat啟動或停止時載入或儲存使用者資料,可以定義一個自定義的使用者資料管理監聽器:

<Listener className="com.example.UserDataManager" />

場景8:Tomcat安全監聽器

Tomcat提供了一些內建的安全監聽器,用於在啟動和停止時進行安全相關的初始化和清理:

<Listener className="org.apache.catalina.authenticator.AuthenticatorBase" />

8. <Realm>

<Realm>元素在Tomcat的server.xml配置檔案中定義了安全域,它負責處理使用者認證和授權。以下是根據不同業務場景的<Realm>配置示例:

場景1:使用記憶體認證

在開發環境中,您可能希望使用記憶體中的使用者和角色列表進行認證:

<Realm className="org.apache.catalina.realm.MemoryRealm" />

場景2:使用JDBC資料庫認證

對於生產環境,您可能需要使用資料庫儲存使用者資訊和角色資訊:

<Realm className="org.apache.catalina.realm.JDBCRealm"
        driverName="com.mysql.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/tomcatdb"
        dataSourceName="java:comp/env/jdbc/tomcatDataSource"
        userTable="users" userCredColumn="password" userNameColumn="username" />
  • driverName: JDBC驅動的類名。
  • connectionURL: 資料庫連線URL。
  • dataSourceName: JNDI資源名稱,用於查詢資料來源。
  • userTable: 儲存使用者資訊的資料庫表。
  • userCredColumn: 儲存密碼的列。
  • userNameColumn: 儲存使用者名稱的列。

場景3:使用JAAS認證

如果您的應用需要使用Java Authentication and Authorization Service (JAAS),可以配置JAAS認證:

<Realm className="org.apache.catalina.realm.JAASRealm"
        appName="myApp" />
  • appName: JAAS應用的名稱。

場景4:使用LDAP認證

當使用者資訊儲存在LDAP伺服器時,可以使用LDAP認證:

<Realm className="org.apache.catalina.realm.JNDIRealm"
        userPattern="uid={0},ou=people,dc=example,dc=com"
        connectionName="uid=admin,ou=people,dc=example,dc=com"
        connectionPassword="adminpassword"
        url="ldap://ldap.example.com:389/" />
  • userPattern: LDAP中使用者資訊的搜尋模式。
  • connectionName: 連線LDAP伺服器的使用者名稱。
  • connectionPassword: 連線LDAP伺服器的密碼。
  • url: LDAP伺服器的URL。

場景5:使用自定義Realm

如果您有特殊的認證需求,可以建立自定義的Realm實現:

<Realm className="com.example.MyCustomRealm" />

場景6:結合多個Realm使用

在某些業務場景中,您可能需要結合多個Realm進行認證,例如,首先嚐試使用記憶體認證,如果失敗再嘗試使用資料庫認證:

<Realm className="org.apache.catalina.realm.CombinedRealm">
    <Realm className="org.apache.catalina.realm.MemoryRealm" />
    <Realm className="org.apache.catalina.realm.JDBCRealm"
           driverName="..."
           connectionURL="..."
           userTable="..."
           userCredColumn="..."
           userNameColumn="..." />
</Realm>
  • CombinedRealm: 組合多個Realm的認證器。

場景7:使用容器管理的Realm

如果您使用Tomcat在應用伺服器(如GlassFish或JBoss)中,可能需要使用容器管理的Realm:

<Realm className="org.apache.catalina.realm.ContainerRealm"
        ignoreEmptyPassword="true" />
  • ignoreEmptyPassword: 是否忽略空密碼。

9. <Valve>

<Valve>元素在Tomcat的server.xml配置檔案中用於插入自定義的處理邏輯,這些處理邏輯可以在請求處理管道的不同階段執行。以下是根據不同業務場景的<Valve>配置示例:

場景1:訪問日誌記錄

記錄每個請求的詳細日誌資訊,這對於分析流量和除錯應用非常有用:

<Valve className="org.apache.catalina.valves.AccessLogValve" 
       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  • pattern: 定義日誌的格式,%h, %l, %u, %t, %r, %s, %b 分別代表主機名、登入名、使用者ID、時間、請求行、狀態碼和位元組數。

場景2:請求響應時間記錄

監控每個請求的響應時間,以評估應用效能:

<Valve className="org.apache.catalina.valves.RequestDumpValve" />

場景3:請求過濾

過濾特定的請求,例如禁用或限制某些HTTP方法:

<Valve className="org.apache.catalina.valves.MethodDisablerValve" methods="TRACE" />
  • methods: 指定要禁用的HTTP方法列表。

場景4:靜態資源快取

為靜態資源設定快取頭,以提高響應速度和減少伺服器負載:

<Valve className="org.apache.catalina.valves.StaticResourcesValve" 
       cache="maxSize=100000,ttl=3600" />
  • cache: 定義快取的大小和時間(TTL)。

場景5:SSL認證

強制所有請求都使用SSL連線,增強應用安全性:

<Valve className="org.apache.catalina.valves.SSLValve" keystoreFile="/path/to/keystore.jks" keystorePass="password" />
  • keystoreFile: 金鑰庫檔案的路徑。
  • keystorePass: 金鑰庫的密碼。

場景6:請求重寫

根據特定規則重寫請求URI,用於URL重定向或重寫:

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

場景7:自定義請求處理

執行自定義的請求處理邏輯,例如使用者請求的預處理或後處理:

<Valve className="com.example.MyCustomRequestValve" />

場景8:會話管理

自定義會話管理邏輯,例如會話超時處理或會話持久化:

<Valve className="org.apache.catalina.valves.SessionValve" />

場景9:錯誤頁面定製

自定義錯誤頁面的響應,例如為不同的HTTP狀態碼定義不同的錯誤頁面:

<Valve className="org.apache.catalina.valves.ErrorReportValve" 
       showReport="false" showServerInfo="false" />
  • showReport: 是否顯示詳細的錯誤報告。
  • showServerInfo: 是否顯示伺服器資訊。

最後

以上是 server.xml 檔案中重要的配置項,在專案應用中,不同的場景配置也不同,以上供你參考,如果你願意分享你在專案中的配置場景案例,歡迎評論區見,卷的時代,兄弟們一起攙扶前行。

相關文章