Tomcat 基本配置

tomcat讀取配置文件

首先簡單說一下tomcat是如何讀取配置文件的。tomcat在啓動時,首先找系統變量CATALINA_BASE,如果沒有,則找CATALINA_HOME。然後找這個變量所指的目錄下的conf文件夾,從中讀取配置文件。

最重要的配置文件:server.xml

要配置tomcat,基本上了解server.xml,context.xml和web.xml就可以了。在Tomcat中,都有這幾個文件的默認文件,如server.xml的內容如下:
  1. <Server port=”8005” shutdown=”SHUTDOWN”>  
  2. ...  
  3. <Service name=”Catalina”>  
  4. <Connector port=”8080” protocol=”HTTP/1.1”  
  5. maxThreads=”150” connectionTimeout=”20000”  
  6. redirectPort=”8443” />  
  7. <Connector port=”8009” protocol=”AJP/1.3” redirectPort=”8443” />  
  8. <Engine name=”Catalina” defaultHost=”localhost”>  
  9. <Realm className=”org.apache.catalina.realm.UserDatabaseRealm”  
  10. resourceName=”UserDatabase”/>  
  11. <Host name=”localhost” appBase=”webapps”  
  12. unpackWARs=”true” autoDeploy=”true”  
  13. xmlValidation=”false” xmlNamespaceAware=”false”>  
  14. </Host>  
  15. </Engine>  
  16. </Service>  
  17. </Server>  
 

The Server Component

  1. <Server port=”8005” shutdown=”SHUTDOWN”>  
 
頂層元素爲<server>,這個元素對應着Tomcat結構中的server部分。這一行的意思是讓Tomcat在8005端口監聽關閉消息,如果使用telnet連接8005端口並輸入SHUTDOWN,則tomcat就會關閉。爲了安全,tomcat不會接受遠程通過這個端口發的消息。
<Server>還有一些其他屬性,如果不做配置的話,這些屬性將使用默認值,下面是這些屬性的介紹。
屬性 描述 是否必須?
className 表示server的類,需要實現org.apache.catalina.Server接口。tocmat6默認值使用rg.apache.catalina.core.StandardServer
port 用來監聽shutdown屬性所對應的那個命令,實現關閉tomcat操作的TCP端口。tocmat會檢查連接是否來自同一臺機器,只有同一臺機器(物理地址)發來的消息才被接受。
shutdown tomcat會監聽port所規定的端口,來接受這個屬性所規定的命令
<Server>還有一些子標籤,內容如下:
屬性 描述 數量
<Service> 包括一組和一個<Engine>相關聯的<Connector>。這些Connector可以併發地接收各種協議的請求,並交給<Engine>來處理 1 or more
<Listener> 用來監聽Server生命週期(start, stop, before start, after start, before stop, after stop)信息 0 or more
<GlobalNamingResources> 整個tomcat實例都可以使用的JNDI資源 0 or more

The Service Component

Service component包括一組Connector和一個Engine,這些Connector監聽不同端口不同協議的請求,並且這些Connector是併發執行的,Engine則被用來處理這些請求。在默認的server.xml中,service標籤的內容如下:
<Service name=”Catalina”>
<service>可以有以下屬性:    
屬性 描述 必需?
className service compoent所對應的java類,默認實現org.apache.catalina.core.StandServic
name service的name,通常在administration,management和logging中使用
<service>擁有這些子元素:
子元素 描述 數量
Connector 作用爲處理外部的連接請求並將其發送給Engine處理。一個Connector擁有幾個線程和相應資源來處理這些請求。 1 or more
Engine 常用類型有兩種,Catalina和Standalone。Engine是用來處理Connector發過來的請求的。 1

The Connector Component

tomcat6提供了兩種Connector,分別爲HTTP/1.1和AJP/1.3。這兩種Connector在默認的server.xml中的配置爲:
  1. <Connector port=”8080” protocol=”HTTP/1.1”  
  2. maxThreads=”150” connectionTimeout=”20000”  
  3. redirectPort=”8443” />  
  4. <Connector port=”8009” protocol=”AJP/1.3” redirectPort=”8443” />  
 

The Engine Component

Engine在server.xml中的代碼如下:
  1. <Engine name=”Catalina” defaultHost=”localhost”>  
  2. ...  
  3. </Engine>  
一個Engine就是一個容器,servlet容器。一個Engine可以處理多個虛擬Host(apache中的概念)的請求。當Engine不知該將請求交給那個host時,Engine則將請求轉給defaultHost來處理。
<Engine>的屬性如下表所示:
屬性 描述 必需?
className Engine所對應的java類,默認使用org.apache.catalina.core.StandardEngine
backgroundProcessDelay
單位爲秒,在這個屬性所定義的時間之後,此Engine將進入後臺處理。如果該值爲負,則直接進入後臺處理。後臺處理一般用於處理低優先級的任務。    
defaultHost 當Engine找不到請求對應的host時,就使用這個host
jvmRoute 這是tomcat6在負載均衡中使用的標識符,
name Engine的名稱
作爲一個容器,Engine有許多子元素,具體內容如下表:
子元素 描述 數量
Host 每個<Host>元素都表示一個由Engine支配的虛擬主機(virtual host) 1 or more
Context 一組屬性-元素的配置集合。在默認的context定義的屬性可以被Engine中所有的web應用程序所使用。 0 or 1
Realm 用於身份驗證等安全機制,Engine和Context都可以由Realm。如果不指定,則使用Engine的Realm。 0 or 1
Valve Standard Valve用於登陸日誌,請求過濾等 0 or more
Listener 用於tomcat生命週期控制 0 or more

The Realm Component

在默認的server.xml中,Engine中的第一個子標籤就是<Realm>了,其代碼如下:
  1. <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>  
這段代碼是對一個UserDatabase Realm的配置,它讓默認的web應用程序(manager)加載tomcat-user.xml來進行用戶驗證。
Realm可以從很多其他數據源獲取驗證數據,而這也正是不同的Realm的不同之處。一般地,Realm可以從這些數據源獲取用戶驗證數據:
  • 內存(memory):使用在內存中存放的一個表格進行驗證。這個表格時在tomcat啓動時從一個xml文件加載到內存中的,在這個表格中的信息格式一般爲:用戶名/密碼/角色。這種方式一般只用於測試和開發階段,最終產品很少使用這種方式
  • UserDatabase:實現了一個可以修改的、持久的memory Realm,可以向後兼容memory Realm。
  • JDBC:使用一個關係數據庫存放用戶驗證數據
  • DataSource:類似於JDBC Realm,使用JNDI的方式來從關係數據庫中拿用戶驗證數據,內容最終還是在一個關係數據庫裏。
  • JNDI:使用JNDI來獲取Realm數據,這些數據一般存放在LDAP目錄下。
  • JAAS:  使用JAAS來獲取用戶驗證信息

The Host Component

每個Host Component都是一個容器,每個<Host>標籤都表示一個virtual host,在默認的<server.xml>中,Host的配置如下:
  1. <Host name=”localhost” appBase=”webapps”  
  2. unpackWARs=”true” autoDeploy=”true”  
  3. xmlValidation=”false” xmlNamespaceAware=”false”>  
 
這段代碼的意思是:定義一個名爲localhost的虛擬主機,應用程序存放在CATALINA_HOME/webapps目錄中。unpackWARs=“true”讓tomcat在webapps文件夾中發現war文件時,自動將其解壓。解壓的好處是可以使程序運行更快,不解壓也可以使用。
下圖爲virtual host的示意圖
<Host>有這些屬性:
屬性 描述 必需?
className
默認爲org.
apache.catalina.core.StandardHost
appBase web應用程序文件存放的位置,相對路徑爲CATALINA_HOMEM
autoDeploy 設爲true,則web.xml發生變化時,tomcat自動重新部署程序。實現這個功能必需允許後臺處理
name virtual host的名稱
backgroundProcessingDelay 跟Engine中的backgroundProcessingDelay類似
deployOnStartup 若爲true,則當這個Engine啓動時,tomcat將自動部署這個host,默認爲true
deployXML 這個屬性的目的是爲了提高tomcat的安全性,控制web應用程序是否能使用META-INF/contex.xml。如果設爲false,則各應用程序只能訪問
$CATALINA_HOME/conf/<engine>/<host>/<app>.xml。默認值爲True。
errorReportValveClass 定義host使用的error-reporting Valve,默認值爲
org.apache.catalina.valves.ErrorReportValve
unpackWARs tomcat在webapps文件夾中發現war文件時,是否自動將其解壓
workdir tomcat使用這個目錄來放工作着的servlet和jsp(以servlet形式),這裏面的servlet都是是編譯好的class文件。默認爲$CATALINA_HOME/work
<Host>有這些子標籤
子元素 描述 數量
Context 爲了實現服務器配置和應用程序配置的分離,一般不會在server.xml中設置這個標籤的內容。所有應用程序的配置都可以在$CATALINA_HOME/conf/<engine>/<host>目錄下維護,名稱爲:應用程序名.xml。程序員可以通過在META-INF目錄下維護自己的context.xml,這個context.xml會被自動以“應用程序名.xml”放到$CATALINA_HOME/conf/<engine>/<host> 0 or more
DefaultContext 當host不知將請求發給哪個context時,就發給它 0 or 1
Realm 這個Host所使用的Realm 0 or 1

Web Application Context Definitions

在tomcat6中,web應用程序的具體配置是在$CATALINA_HOME/conf/<engine name>/<host name>目錄下的“應用程序名.xml”中定義的,在eclipse或netbeans中,用戶可以在META-INF/context.xml中做配置,這些IDE會自動在$CATALINA_HOME/conf/<engine name>/<host name>下創建“應用程序名.xml”文件。
在war包(或文件夾)的META-INF中的配置文件叫做嵌入式配置文件(embedded),默認tomcat在部署時使用這些配置文件,管理員可以通過修改deployXML屬性來禁止解析這種嵌入式配置文件。

默認context.xml文件

在$CATALINA_HOME/conf目錄下的context.xml是tomcat默認的context.xml文件,tomcat下所有的應用程序都使用這個文件的配置。因爲它是公共的,因此裏面的內容必須是所有web應用程序通用的,默認的context.xml內容只有一行:
  1. <Context>  
  2. <WatchedResource>WEB-INF/web.xml</WatchedResource>  
  3. </Context>  
 
在這裏的web.xml被Context的一個後臺程序監視,一旦發生改變,將重新部署這個Context。
context有以下這些屬性:
屬性 描述 必需?
className Context的java類,默認爲org.apache.catalina.core.StandardContext
allowLinking 在像linux這種允許符號鏈接(symbolic link)的操作系統中,這個選項爲True則運行該文件被鏈接到web應用程序樹之外。在windows中,這個選項必需爲false。默認值爲false
antiJARLocking 使用特殊的類加載器來儘量避免JAR文件的鎖定,默認爲false。
antiResourceLocking 使用特殊方法來儘量避免文件鎖定,默認爲false。
backgroundProcessDelay 同其他backgroundProcessDelay
catcheMaxSize 設置資源代碼(resource code)的最大值,默認爲10240,單位爲KB
catcheTTL 驗證cache的間隔時間,單位爲微秒,默認值爲5000
cachingAllowed 決定靜態資源(配置文件,圖片等)是否可以加載進cache中,默認爲true
caseSensitive 決定tocmat是否進行大小寫檢查,默認爲true
cookies 使用cookie來進行session管理,默認爲true。如果設爲false,則需要使用url重寫的方式維護session
crossContext
當使用ServletContext.getContext()方法時,允許同一個virtual host下的程序跨Context訪問,默認爲false
docBase
在這個Context下運行的web應用程序的文檔根目錄,通常被稱爲Context root。如果web應用程序是以war文件的方式部署的,那麼這個屬性的默認值爲webapps/<name of war file>
override 指示本地的context.xml(war中的META-INF/context.xml)是否可以覆蓋全局的context.xml(CATALINA_HOME/conf/context.xml),默認值爲false
path 表示web應用程序的context路徑。如果你想將這個web應用程序作爲此host的默認應用程序,使用這個值:“”;默認值爲docBase,war包名,或者應用程序Context文件名
privileged 默認值爲false,大部分程序這個值設爲false就可以了
processTlds 設置當Context啓動時對TLD進行預處理,默認爲true
reloadable 默認值爲false。設置tocmat是否應該監視/WEB-INF/classes和/WEB-INF/lib中的變化,如果有發生改變,則自動重新部署
swallowOutput 默認爲false。設置System.out和System.error的內容是否應該記錄到日誌文件中
tldNamespacheAware 設置tld的處理和驗證是否是namespace-aware,默認爲false
unloadDelay tomcat等待web應用程序卸載的微秒數,默認爲2000
unpackWAR 默認爲true。設置tomcat自動解壓docBase中的war文件。
useNaming 默認爲true。給web應用程序創建一個JavaEE-JNDI兼容的
InitialContext。如果web應用程序使用數據庫連接,這個選項是必需的
workdir 爲在這個host中運行的servlet定義一個工作目錄。這個host下的應用程序可以通過javax.servlet.context.tempdir屬性來活動這個目錄的位置。默認爲CATALINA_HOME/work
wrapperClass 設置一個實現了org.apache.catalina.Wrapper接口的類r來包裝servlets
<context>有這些子元素:
子元素 描述 數量
Loader 配置用於從一個web應用程序中加載類的ClassLoader 0 or 1
Manager 配置Context的session manager,Session Manager創建,維護並保持服務器端的session。 0 or 1
Realm 這個Context中運行的web應用程序使用的Realm 0 or 1
Resources 用於獲取resource。使用實現org.apache.naming.resources.FileDirContext接口的類來實現。 0 or 1
WatchedResource 當特定的資源發生改變時,用於通知AutoDeployer對web應用程序進行重新部署 0 or 1

身份驗證和tomcat-users.xml

tomcat-users.xml位於$CATALINA_HOME/conf文件夾下,tomcat6使用這個文件來對使用manager工具的用戶(也就是管理員)進行身份驗證。tomcat6使用UserDatabase Realm來具體實現這個功能。Realm允許修改加載的數據,並可以通過將這些修改寫回xml的方式來使這些修改持久化。

默認的部署配置文件--web.xml

根據servlet2.5的標準,任何一個servlet都必須在web.xml中註冊,這個文件必須以web.xml放到web應用程序的WEB-INF目錄下。這樣可以這個web.xml就只對這個web應用程序有作用。
在$CATALINA_HOME/conf下也有一個web.xml,這個web.xml是這個tomcat實例下所有web應用程序都可以使用的。不過可以在context中修改orverride屬性,來決定各web應用程序的web.xml是否可以覆蓋全局的web.xml。
下面是默認的全局web.xml:
  1. <?xml version=”1.0” encoding=”ISO-8859-1”?>  
  2. <web-app xmlns=”http://java.sun.com/xml/ns/j2ee”  
  3. xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”  
  4. xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd”  
  5. version=”2.4”>  
 
與server.xml不同,web.xml可以用schema進行驗證。

默認Server上靜態資源的配置

在下面的<servlet>標籤中,定義了一個默認的servlet。這個默認的servlet是用來處理所有web應用程序的靜態資源請求的,也可以提供目錄展示(directory listing)服務。也就是說,這個servlet相當於一個像apache這樣的http web server。
在默認的web.xml中對默認servlet的配置:
  1. <servlet>  
  2. <servlet-name>default</servlet-name>  
  3. <servlet-class>  
  4. org.apache.catalina.servlets.DefaultServlet  
  5. </servlet-class>  
  6. <init-param>  
  7. <param-name>debug</param-name>  
  8. <param-value>0</param-value>  
  9. </init-param>  
  10. <init-param>  
  11. <param-name>listings</param-name>  
  12. <param-value>true</param-value>  
  13. </init-param>  
  14. <load-on-startup>1</load-on-startup>  
  15. </servlet>  
 

默認目錄列表和其他用戶自定義配置

如果你不想提供用戶列表功能,可以將下面代碼段中的true改爲false
  1. <param-name>listings</param-name>  
  2. <param-value>true</param-value>  
 
默認servlet(default servlet)還有這些屬性:
參數 描述
listing 當有到一個目錄的請求時,是否顯示目錄結構,一般設爲true。
readonly 控制是否允許PUT,POST等HTTP寫命令
input 讀取資源時的緩衝區大小,一般爲2KB
output 寫資源時的緩衝區大小,一般也爲2KB
globalXsltFile/localXsltFile 定義一個顯示目錄列表時使用的xslt。
sendfileSize tomcat6支持基於某個具體操作系統平臺的異步sendfile()。這個值用來設置使用sendfile()方法的閥值,默認爲48KB。

配置invoker servlet

invoker servlet是可以通過下面這種方式直接訪問的servlet(沒有參數)
http://<host name>/<context path>/servlet/<servlet name>
因爲這種方式可以直接訪問servlet,因此存在一定的安全隱患,所以這種方式應該僅在開發和測試階段使用,也正因爲這個原因,在tomcat6的默認web.xml中invoker servlet這段配置被註釋了起來:
  1. <!--  
  2. <servlet>  
  3. <servlet-name>invoker</servlet-name>  
  4. <servlet-class>  
  5. org.apache.catalina.servlets.InvokerServlet  
  6. </servlet-class>  
  7. <init-param>  
  8. <param-name>debug</param-name>  
  9. <param-value>0</param-value>  
  10. </init-param>  
  11. <load-on-startup>2</load-on-startup>  
  12. </servlet>  
  13. -->  
 

配置JspServlet(Jasper)

JspServlet的作用是將jsp文件轉爲servlet。這個servlet一般被人們成爲Jasper,Jasper的配置如下:

  1. JspServlet的作用是將jsp文件轉爲servlet。這個servlet一般被人們成爲Jasper,Jasper的配置如下:  
  2. <servlet>  
  3. <servlet-name>jsp</servlet-name>  
  4. <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>  
  5. <init-param>  
  6. <param-name>fork</param-name>  
  7. <param-value>false</param-value>  
  8. </init-param>  
  9. <init-param>  
  10. <param-name>xpoweredBy</param-name>  
  11. <param-value>false</param-value>  
  12. </init-param>  
  13. <load-on-startup>3</load-on-startup>  
  14. </servlet>  
 
Jasper還有以下這些啓動參數:
參數 描述
development 默認值爲true,說明jsp文件還處於開發階段,因此Jasper應該按modificationTestInterval參數對jsp文件進行檢查,當jsp發生更改時,則對其進行重編譯
fork 默認值爲true。指示使用不同的JVM編譯JSP,這樣可以消除資源競爭和在開發階段的類加載器衝突
checkInterval 單位爲秒,規定Jasper按這個時間間隔檢查jsp是否需要重編譯,默認爲0,指示使用後臺程序處理
modificationTestInterval 主要在development爲true時發揮作用,默認值爲4。Jasper將按這個頻率檢查jsp文件是否可以驗證是否修改過。
compiler 讀取資源時使用的緩存大小,默認爲2KB
classdebuginfo 寫資源時使用的緩存大小,默認爲2KB
keepgenerated 默認值爲true。指示Jasper在兩次調用servlet之間在工作目錄中保留那個servlet,這樣可以大大提高tomcat的效率
mappedfilegenStrAsCharArray
dumpSmaptrimSpaces
supressSmap
這些是jsp開發者使用的優化和調試選項。
scratchDir Jasper在編譯jsp時使用的臨時文件夾,默認爲$CATALINA_HOME/work下的一個臨時文件夾
xpoweredBy 默認爲false。功能爲生成X-Power-By頭(header)
compilerTargetVM 編譯生成的servlet的目標VM
compilerSourceVM 生成servlet的源VM

SSL和CGI Servlet的配置

在默認的web.xml中,這些Servlet的配置被註釋起來了,如果你想在Standalone模式下的Tomcat中添加Apache-styleserver-side include(SSI),那麼這段註釋就應該被移除。
  1. <!--  
  2. <servlet>  
  3. <servlet-name>ssi</servlet-name>  
  4. <servlet-class>org.apache.catalina.ssi.SSIServletServlet</servlet-class>  
  5. <init-param>  
  6. <param-name>buffered</param-name>  
  7. <param-value>1</param-value>  
  8. </init-param>  
  9. <init-param>  
  10. <param-name>debug</param-name>  
  11. <param-value>0</param-value>  
  12. </init-param>  
  13. <init-param>  
  14. <param-name>expires</param-name>  
  15. <param-value>666</param-value>  
  16. </init-param>  
  17. <init-param>  
  18. <param-name>isVirtualWebappRelative</param-name>  
  19. <param-value>0</param-value>  
  20. </init-param>  
  21. <load-on-startup>4</load-on-startup>  
  22. </servlet>  
  23. -->  
 
下面的這個配置也是有關使tomcat以Standalone方式處理CGI請求的。
  1. <!--  
  2. <servlet>  
  3. <servlet-name>cgi</servlet-name>  
  4. <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>  
  5. <init-param>  
  6. <param-name>clientInputTimeout</param-name>  
  7. <param-value>100</param-value>  
  8. </init-param>  
  9. <init-param>  
  10. <param-name>debug</param-name>  
  11. <param-value>6</param-value>  
  12. </init-param>  
  13. <init-param>  
  14. <param-name>cgiPathPrefix</param-name>  
  15. <param-value>WEB-INF/cgi</param-value>  
  16. </init-param>  
  17. <load-on-startup>5</load-on-startup>  
  18. </servlet>  
  19. -->  
 

Servlet Mappings

<servlet-mapping>用來說明如何處理相應的URL請求,如:
  1. <servlet-mapping>  
  2. <servlet-name>default</servlet-name>  
  3. <url-pattern>/</url-pattern>  
  4. </servlet-mapping>  
 
規則是這樣的,如果傳進來的url符合/模式,則傳給名爲default的Servlet處理。
例如,如果主機名爲www.example.com,並且使用Standalone模式運行的tocmat,則下面這個請求將被傳給<servlet-name>爲default的Servlet:
www.example.com/<context path>/
如果沒在<Context>中明確標明,則<context path>的值爲war文件名
根據前面<servlet>中定義的<servlet-name>對應的servlet,可以知道tomcat將使用org.apache.catalina.servlets.DefaultServlet來處理這個模式的請求
下面的這兩個<servlet-mapping>標籤指示所有包含*.jsp和*.jspx的url都將傳給名爲jsp的servlet處理。
  1. <servlet-mapping>  
  2. <servlet-name>jsp</servlet-name>  
  3. <url-pattern>*.jsp</url-pattern>  
  4. </servlet-mapping>  
  5. <servlet-mapping>  
  6. <servlet-name>jsp</servlet-name>  
  7. <url-pattern>*.jspx</url-pattern>  
  8. </servlet-mapping>  
 

server.xml,context.xml和web.xml是如何一起協同工作的

下面這幅圖是對tomcat處理一個http請求的一個示意

SSI和CGI mappings

在web.xml中,SSI和CGI的<servlet-mapping>的配置被註釋掉了,如果tocmat是在Standalone模式下運行,並且要處理SSI和CGI請求,那麼這幾行註釋可以去掉:
  1. <!--  
  2. <servlet-mapping>  
  3. <servlet-name>ssi</servlet-name>  
  4. <url-pattern>*.shtml</url-pattern>  
  5. </servlet-mapping>  
  6. -->  
  7. <!-- The mapping for the CGI Gateway servlet -->  
  8. <!--  
  9. <servlet-mapping>  
  10. <servlet-name>cgi</servlet-name>  
  11. <url-pattern>/cgi-bin/*</url-pattern>  
  12. </servlet-mapping>  
  13. -->  
 

Session的超時配置

<session-config>標籤配置tomcat6在服務器端維持一個表示客戶端的session的時間,單位爲分鐘。
  1. <session-config>  
  2. <session-timeout>30</session-timeout>  
  3. </session-config>  
 
MIME Mapping
  1. <mime-mapping>  
  2. <extension>abs</extension>  
  3. <mime-type>audio/x-mpeg</mime-type>  
  4. </mime-mapping>  
  5. <mime-mapping>  
  6. <extension>ai</extension>  
  7. <mime-type>application/postscript</mime-type>  
  8. </mime-mapping>  
  9. <mime-mapping>  
  10. <extension>aif</extension>  
  11. <mime-type>audio/x-aiff</mime-type>  
  12. </mime-mapping>  
  13. <mime-mapping>  
  14. <extension>aifc</extension>  
  15. <mime-type>audio/x-aiff</mime-type>  
  16. </mime-mapping>  
  17. ... more mime mappings...  
  18. <mime-mapping>  
  19. <extension>Z</extension>  
  20. <mime-type>application/x-compress</mime-type>  
  21. </mime-mapping>  
  22. <mime-mapping>  
  23. <extension>z</extension>  
  24. <mime-type>application/x-compress</mime-type>  
  25. </mime-mapping>  
  26. <mime-mapping>  
  27. <extension>zip</extension>  
  28. <mime-type>application/zip</mime-type>  
  29. </mime-mapping>  
 

模擬Apache Web Server:首頁定義

  1. <welcome-file-list>  
  2. <welcome-file>index.html</welcome-file>  
  3. <welcome-file>index.htm</welcome-file>  
  4. <welcome-file>index.jsp</welcome-file>  
  5. </welcome-file-list>  
  6. </web-app>  
 

catalina.policy:訪問控制文件

Tomcat6使用的時內置的Java2安全模型,這個安全模型的核心思想是:
Any access to system resources that is not explicitly allowed is prohibited.
翻譯過來是:除非明確授權,否則禁止訪問
默認tocmat啓動時是不使用這種安全策略的,除非使用這個參數啓動:
> startup -security
在這個文件中,授予權限的語法一般是:
  1. grant <security principal> { permission list... };  
  2. 下面是catalina.policy中的一個片段:  
  3. // These permissions apply to javac  
  4. grant codeBase “file:${java.home}/lib/-” {  
  5. permission java.security.AllPermission;  
  6. };  
  7. // These permissions apply to all shared system extensions  
  8. grant codeBase “file:${java.home}/jre/lib/ext/-” {  
  9. permission java.security.AllPermission;  
  10. };  
  11. // These permissions apply to javac when ${java.home] points at $JAVA_HOME/jre  
  12. grant codeBase “file:${java.home}/../lib/-” {  
  13. permission java.security.AllPermission;  
  14. };  
  15. // These permissions apply to all shared system extensions when  
  16. // ${java.home} points at $JAVA_HOME/jre  
  17. grant codeBase “file:${java.home}/lib/ext/-” {  
  18. permission java.security.AllPermission;  
  19. };  
 
這段代碼賦予所有資源訪問java編譯器所有資源的權利
  1. // These permissions apply to the daemon code  
  2. grant codeBase “file:${catalina.home}/bin/commons-daemon.jar” {  
  3. permission java.security.AllPermission;  
  4. };  
  5. // These permissions apply to the logging API  
  6. grant codeBase “file:${catalina.home}/bin/tomcat-juli.jar” {  
  7. permission java.security.AllPermission;  
  8. };  
  9. // These permissions apply to the server startup code  
  10. grant codeBase “file:${catalina.home}/bin/bootstrap.jar” {  
  11. permission java.security.AllPermission;  
  12. };  
  13. // These permissions apply to the servlet API classes  
  14. // and those that are shared across all class loaders  
  15. // located in the “lib” directory  
  16. grant codeBase “file:${catalina.home}/lib/-” {  
  17. permission java.security.AllPermission;  
  18. };  
 
這段代碼將Server code,logging code以及API庫的訪問權限賦予所有資源。
最後這組代碼是有關web應用程序的默認權限的。與前面的不同,這裏的限制更加嚴格,因爲它們從沒有獲得java.security.AllPermission授權。
第一部分是有關JDBC和JNDI的
  1. grant {  
  2. // Required for JNDI lookup of named JDBC DataSource’s and  
  3. // javamail named MimePart DataSource used to send mail  
  4. permission java.util.PropertyPermission “java.home”, “read”;  
  5. permission java.util.PropertyPermission “java.naming.*”, “read”;  
  6. permission java.util.PropertyPermission “javax.sql.*”, “read”;  
 
第二部分是授予對操作系統信息的讀權限
/
  1. / OS Specific properties to allow read access  
  2. permission java.util.PropertyPermission “os.name”, “read”;  
  3. permission java.util.PropertyPermission “os.version”, “read”;  
  4. permission java.util.PropertyPermission “os.arch”, “read”;  
  5. permission java.util.PropertyPermission “file.separator”, “read”;  
  6. permission java.util.PropertyPermission “path.separator”, “read”;  
  7. permission java.util.PropertyPermission “line.separator”, “read”;  
 
第三部分代碼賦予對一些JVM相關屬性的讀權限
  1. // JVM properties to allow read access  
  2. permission java.util.PropertyPermission “java.version”, “read”;  
  3. permission java.util.PropertyPermission “java.vendor”, “read”;  
  4. permission java.util.PropertyPermission “java.vendor.url”, “read”;  
  5. permission java.util.PropertyPermission “java.class.version”, “read”;  
  6. permission java.util.PropertyPermission “java.specification.version”,  
  7. “read”;  
  8. permission java.util.PropertyPermission “java.specification.vendor”,  
  9. “read”;  
  10. permission java.util.PropertyPermission “java.specification.name”, “read”;  
  11. permission java.util.PropertyPermission “java.vm.specification.version”,  
  12. “read”;  
  13. permission java.util.PropertyPermission “java.vm.specification.vendor”,  
  14. “read”;  
  15. permission java.util.PropertyPermission “java.vm.specification.name”,  
  16. “read”;  
  17. permission java.util.PropertyPermission “java.vm.version”, “read”;  
  18. permission java.util.PropertyPermission “java.vm.vendor”, “read”;  
  19. permission java.util.PropertyPermission “java.vm.name”, “read”;  
 
第四部分是有關JMX的
  1. // Required for OpenJMX  
  2. permission java.lang.RuntimePermission “getAttribute”;  
 
最後這兩部分是有關XML parser和預編譯JSP的,在編碼階段經常使用
  1. // Allow read of JAXP compliant XML parser debug  
  2. permission java.util.PropertyPermission “jaxp.debug”, “read”;  
  3. // Precompiled JSPs need access to this package.  
  4. permission java.lang.RuntimePermission  
  5. “accessClassInPackage.org.apache.jasper.runtime”;  
  6. permission java.lang.RuntimePermission  
  7. “accessClassInPackage.org.apache.jasper.runtime.*”;};  
 

catalina.properties:更好的訪問控制

tocmat以安全模式啓動時,最後加載的一個文件就是catalina.properties,這個文件允許管理員在java package(java 包)一級上進行權限控制。當有非法請求到達時,java package這一級的控制可以拋出SecurityException異常。
在catalina.properties中的這幾行代碼定義了限制訪問的包:
  1. package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,  
  2. org.apache.jasper.,sun.beans.  
  3. package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,  
  4. org.apache.tomcat.,org.apache.jasper.  
 
這幾行定義了comon,server和shared的類加載器的路徑:
  1. common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar  
  2. server.loader=  
  3. shared.loader=  
 
catalina.properties的最後一行開啓了string cache的使用。這個cache將在ByteChunk.toString()和CharChunk.toString()方法中使用
tomcat.util.buf.StringCache.byte.enabled=true

配置(Configuration)和管理(management)的不同

簡單地說,配置是在Tomcat啓動之前進行的,而管理則是在Tomcat運行過程中進行的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章