奉陪了

博客园 首页 联系 订阅 管理
Tomcat 基本配置 
tomcat读取配置文件 
首先简单说一下tomcat是如何读取配置文件的。tomcat在启动时,首先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME。然后找这个变量所指的目录下的conf文件夹,从中读取配置文件。 
最重要的配置文件:server.xml 
要配置tomcat,基本上了解server.xml,context.xml和web.xml就可以了。在Tomcat中,都有这几个文件的默认文件,如server.xml的内容如下: 
view plaincopy to clipboardprint? 
<Server port=”8005” shutdown=”SHUTDOWN”>  
...   
<Service name=”Catalina”>  
<Connector port=”8080” protocol=”HTTP/1.1”   
maxThreads=”150” connectionTimeout=”20000”   
redirectPort=”8443” />  
<Connector port=”8009” protocol=”AJP/1.3” redirectPort=”8443” />  
<Engine name=”Catalina” defaultHost=”localhost”>  
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”   
resourceName=”UserDatabase”/>  
<Host name=”localhost” appBase=”webapps”   
unpackWARs=”true” autoDeploy=”true”   
xmlValidation=”false” xmlNamespaceAware=”false”>  
</Host>  
</Engine>  
</Service>  
</Server>  
<Server port=”8005” shutdown=”SHUTDOWN”> 
... 
<Service name=”Catalina”> 
<Connector port=”8080” protocol=”HTTP/1.1” 
maxThreads=”150” connectionTimeout=”20000” 
redirectPort=”8443” /> 
<Connector port=”8009” protocol=”AJP/1.3” redirectPort=”8443” /> 
<Engine name=”Catalina” defaultHost=”localhost”> 
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm” 
resourceName=”UserDatabase”/> 
<Host name=”localhost” appBase=”webapps” 
unpackWARs=”true” autoDeploy=”true” 
xmlValidation=”false” xmlNamespaceAware=”false”> 
</Host> 
</Engine> 
</Service> 
</Server> 
The Server Component 
view plaincopy to clipboardprint? 
<Server port=”8005” shutdown=”SHUTDOWN”>  
<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中的配置为: 
view plaincopy to clipboardprint? 
<Connector port=”8080” protocol=”HTTP/1.1”   
maxThreads=”150” connectionTimeout=”20000”   
redirectPort=”8443” />  
<Connector port=”8009” protocol=”AJP/1.3” redirectPort=”8443” />  
<Connector port=”8080” protocol=”HTTP/1.1” 
maxThreads=”150” connectionTimeout=”20000” 
redirectPort=”8443” /> 
<Connector port=”8009” protocol=”AJP/1.3” redirectPort=”8443” /> 

The Engine Component 
Engine在server.xml中的代码如下: 
view plaincopy to clipboardprint? 
<Engine name=”Catalina” defaultHost=”localhost”>  
...   
</Engine>  
<Engine name=”Catalina” defaultHost=”localhost”> 
... 
</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>了,其代码如下: 
这段代码是对一个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的配置如下: 
view plaincopy to clipboardprint? 
<Host name=”localhost” appBase=”webapps”   
unpackWARs=”true” autoDeploy=”true”   
xmlValidation=”false” xmlNamespaceAware=”false”>  
<Host name=”localhost” appBase=”webapps” 
unpackWARs=”true” autoDeploy=”true” 
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内容只有一行: 
view plaincopy to clipboardprint? 
<Context>  
<WatchedResource>WEB-INF/web.xml</WatchedResource>  
</Context>  
<Context> 
<WatchedResource>WEB-INF/web.xml</WatchedResource> 
</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: 
view plaincopy to clipboardprint? 
<?xml version=”1.0” encoding=”ISO-8859-1”?>  
<web-app xmlns=”http://java.sun.com/xml/ns/j2ee”   
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”   
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd”   
version=”2.4”>  
<?xml version=”1.0” encoding=”ISO-8859-1”?> 
<web-app xmlns=”http://java.sun.com/xml/ns/j2ee” 
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” 
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd” 
version=”2.4”> 
与server.xml不同,web.xml可以用schema进行验证。 
默认Server上静态资源的配置 
在下面的<servlet>标签中,定义了一个默认的servlet。这个默认的servlet是用来处理所有web应用程序的静态资源请求的,也可以提供目录展示(directory listing)服务。也就是说,这个servlet相当于一个像apache这样的http web server。 
在默认的web.xml中对默认servlet的配置: 
view plaincopy to clipboardprint? 
<servlet>  
<servlet-name>default</servlet-name>  
<servlet-class>  
org.apache.catalina.servlets.DefaultServlet   
</servlet-class>  
<init-param>  
<param-name>debug</param-name>  
<param-value>0</param-value>  
</init-param>  
<init-param>  
<param-name>listings</param-name>  
<param-value>true</param-value>  
</init-param>  
<load-on-startup>1</load-on-startup>  
</servlet>  
<servlet> 
<servlet-name>default</servlet-name> 
<servlet-class> 
org.apache.catalina.servlets.DefaultServlet 
</servlet-class> 
<init-param> 
<param-name>debug</param-name> 
<param-value>0</param-value> 
</init-param> 
<init-param> 
<param-name>listings</param-name> 
<param-value>true</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 

默认目录列表和其他用户自定义配置 
如果你不想提供用户列表功能,可以将下面代码段中的true改为false 
view plaincopy to clipboardprint? 
<param-name>listings</param-name>  
<param-value>true</param-value>  
<param-name>listings</param-name> 
<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这段配置被注释了起来: 
view plaincopy to clipboardprint? 
<!--   
<servlet>  
<servlet-name>invoker</servlet-name>  
<servlet-class>  
org.apache.catalina.servlets.InvokerServlet   
</servlet-class>  
<init-param>  
<param-name>debug</param-name>  
<param-value>0</param-value>  
</init-param>  
<load-on-startup>2</load-on-startup>  
</servlet>  
-->  
<!-- 
<servlet> 
<servlet-name>invoker</servlet-name> 
<servlet-class> 
org.apache.catalina.servlets.InvokerServlet 
</servlet-class> 
<init-param> 
<param-name>debug</param-name> 
<param-value>0</param-value> 
</init-param> 
<load-on-startup>2</load-on-startup> 
</servlet> 
--> 
配置JspServlet(Jasper) 
JspServlet的作用是将jsp文件转为servlet。这个servlet一般被人们成为Jasper,Jasper的配置如下: 

view plaincopy to clipboardprint? 
JspServlet的作用是将jsp文件转为servlet。这个servlet一般被人们成为Jasper,Jasper的配置如下:   
<servlet>  
<servlet-name>jsp</servlet-name>  
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>  
<init-param>  
<param-name>fork</param-name>  
<param-value>false</param-value>  
</init-param>  
<init-param>  
<param-name>xpoweredBy</param-name>  
<param-value>false</param-value>  
</init-param>  
<load-on-startup>3</load-on-startup>  
</servlet>  
JspServlet的作用是将jsp文件转为servlet。这个servlet一般被人们成为Jasper,Jasper的配置如下: 
<servlet> 
<servlet-name>jsp</servlet-name> 
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> 
<init-param> 
<param-name>fork</param-name> 
<param-value>false</param-value> 
</init-param> 
<init-param> 
<param-name>xpoweredBy</param-name> 
<param-value>false</param-value> 
</init-param> 
<load-on-startup>3</load-on-startup> 
</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),那么这段注释就应该被移除。 
view plaincopy to clipboardprint? 
<!--   
<servlet>  
<servlet-name>ssi</servlet-name>  
<servlet-class>org.apache.catalina.ssi.SSIServletServlet</servlet-class>  
<init-param>  
<param-name>buffered</param-name>  
<param-value>1</param-value>  
</init-param>  
<init-param>  
<param-name>debug</param-name>  
<param-value>0</param-value>  
</init-param>  
<init-param>  
<param-name>expires</param-name>  
<param-value>666</param-value>  
</init-param>  
<init-param>  
<param-name>isVirtualWebappRelative</param-name>  
<param-value>0</param-value>  
</init-param>  
<load-on-startup>4</load-on-startup>  
</servlet>  
-->  
<!-- 
<servlet> 
<servlet-name>ssi</servlet-name> 
<servlet-class>org.apache.catalina.ssi.SSIServletServlet</servlet-class> 
<init-param> 
<param-name>buffered</param-name> 
<param-value>1</param-value> 
</init-param> 
<init-param> 
<param-name>debug</param-name> 
<param-value>0</param-value> 
</init-param> 
<init-param> 
<param-name>expires</param-name> 
<param-value>666</param-value> 
</init-param> 
<init-param> 
<param-name>isVirtualWebappRelative</param-name> 
<param-value>0</param-value> 
</init-param> 
<load-on-startup>4</load-on-startup> 
</servlet> 
--> 
下面的这个配置也是有关使tomcat以Standalone方式处理CGI请求的。 
view plaincopy to clipboardprint? 
<!--   
<servlet>  
<servlet-name>cgi</servlet-name>  
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>  
<init-param>  
<param-name>clientInputTimeout</param-name>  
<param-value>100</param-value>  
</init-param>  
<init-param>  
<param-name>debug</param-name>  
<param-value>6</param-value>  
</init-param>  
<init-param>  
<param-name>cgiPathPrefix</param-name>  
<param-value>WEB-INF/cgi</param-value>  
</init-param>  
<load-on-startup>5</load-on-startup>  
</servlet>  
-->  
<!-- 
<servlet> 
<servlet-name>cgi</servlet-name> 
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class> 
<init-param> 
<param-name>clientInputTimeout</param-name> 
<param-value>100</param-value> 
</init-param> 
<init-param> 
<param-name>debug</param-name> 
<param-value>6</param-value> 
</init-param> 
<init-param> 
<param-name>cgiPathPrefix</param-name> 
<param-value>WEB-INF/cgi</param-value> 
</init-param> 
<load-on-startup>5</load-on-startup> 
</servlet> 
--> 
Servlet Mappings 
<servlet-mapping>用来说明如何处理相应的URL请求,如: 
view plaincopy to clipboardprint? 
<servlet-mapping>  
<servlet-name>default</servlet-name>  
<url-pattern>/</url-pattern>  
</servlet-mapping>  
<servlet-mapping> 
<servlet-name>default</servlet-name> 
<url-pattern>/</url-pattern> 
</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处理。 
view plaincopy to clipboardprint? 
<servlet-mapping>  
<servlet-name>jsp</servlet-name>  
<url-pattern>*.jsp</url-pattern>  
</servlet-mapping>  
<servlet-mapping>  
<servlet-name>jsp</servlet-name>  
<url-pattern>*.jspx</url-pattern>  
</servlet-mapping>  
<servlet-mapping> 
<servlet-name>jsp</servlet-name> 
<url-pattern>*.jsp</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
<servlet-name>jsp</servlet-name> 
<url-pattern>*.jspx</url-pattern> 
</servlet-mapping> 
server.xml,context.xml和web.xml是如何一起协同工作的 
下面这幅图是对tomcat处理一个http请求的一个示意 

SSI和CGI mappings 
在web.xml中,SSI和CGI的<servlet-mapping>的配置被注释掉了,如果tocmat是在Standalone模式下运行,并且要处理SSI和CGI请求,那么这几行注释可以去掉: 
view plaincopy to clipboardprint? 
<!--   
<servlet-mapping>  
<servlet-name>ssi</servlet-name>  
<url-pattern>*.shtml</url-pattern>  
</servlet-mapping>  
-->  
<!-- The mapping for the CGI Gateway servlet -->  
<!--   
<servlet-mapping>  
<servlet-name>cgi</servlet-name>  
<url-pattern>/cgi-bin/*</url-pattern>  
</servlet-mapping>  
-->  
<!-- 
<servlet-mapping> 
<servlet-name>ssi</servlet-name> 
<url-pattern>*.shtml</url-pattern> 
</servlet-mapping> 
--> 
<!-- The mapping for the CGI Gateway servlet --> 
<!-- 
<servlet-mapping> 
<servlet-name>cgi</servlet-name> 
<url-pattern>/cgi-bin/*</url-pattern> 
</servlet-mapping> 
--> 
Session的超时配置 
<session-config>标签配置tomcat6在服务器端维持一个表示客户端的session的时间,单位为分钟。 
view plaincopy to clipboardprint? 
<session-config>  
<session-timeout>30</session-timeout>  
</session-config>  
<session-config> 
<session-timeout>30</session-timeout> 
</session-config> 

MIME Mapping 
view plaincopy to clipboardprint? 
<mime-mapping>  
<extension>abs</extension>  
<mime-type>audio/x-mpeg</mime-type>  
</mime-mapping>  
<mime-mapping>  
<extension>ai</extension>  
<mime-type>application/postscript</mime-type>  
</mime-mapping>  
<mime-mapping>  
<extension>aif</extension>  
<mime-type>audio/x-aiff</mime-type>  
</mime-mapping>  
<mime-mapping>  
<extension>aifc</extension>  
<mime-type>audio/x-aiff</mime-type>  
</mime-mapping>  
... more mime mappings...   
<mime-mapping>  
<extension>Z</extension>  
<mime-type>application/x-compress</mime-type>  
</mime-mapping>  
<mime-mapping>  
<extension>z</extension>  
<mime-type>application/x-compress</mime-type>  
</mime-mapping>  
<mime-mapping>  
<extension>zip</extension>  
<mime-type>application/zip</mime-type>  
</mime-mapping>  
<mime-mapping> 
<extension>abs</extension> 
<mime-type>audio/x-mpeg</mime-type> 
</mime-mapping> 
<mime-mapping> 
<extension>ai</extension> 
<mime-type>application/postscript</mime-type> 
</mime-mapping> 
<mime-mapping> 
<extension>aif</extension> 
<mime-type>audio/x-aiff</mime-type> 
</mime-mapping> 
<mime-mapping> 
<extension>aifc</extension> 
<mime-type>audio/x-aiff</mime-type> 
</mime-mapping> 
... more mime mappings... 
<mime-mapping> 
<extension>Z</extension> 
<mime-type>application/x-compress</mime-type> 
</mime-mapping> 
<mime-mapping> 
<extension>z</extension> 
<mime-type>application/x-compress</mime-type> 
</mime-mapping> 
<mime-mapping> 
<extension>zip</extension> 
<mime-type>application/zip</mime-type> 
</mime-mapping> 
模拟Apache Web Server:首页定义 
view plaincopy to clipboardprint? 
<welcome-file-list>  
<welcome-file>index.html</welcome-file>  
<welcome-file>index.htm</welcome-file>  
<welcome-file>index.jsp</welcome-file>  
</welcome-file-list>  
</web-app>  
<welcome-file-list> 
<welcome-file>index.html</welcome-file> 
<welcome-file>index.htm</welcome-file> 
<welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 
</web-app> 

catalina.policy:访问控制文件 
Tomcat6使用的时内置的Java2安全模型,这个安全模型的核心思想是: 
Any access to system resources that is not explicitly allowed is prohibited. 
翻译过来是:除非明确授权,否则禁止访问 
默认tocmat启动时是不使用这种安全策略的,除非使用这个参数启动: 
> startup -security 
在这个文件中,授予权限的语法一般是: 
view plaincopy to clipboardprint? 
grant <security principal> { permission list... };   
下面是catalina.policy中的一个片段:   
// These permissions apply to javac   
grant codeBase “file:${java.home}/lib/-” {   
permission java.security.AllPermission;   
};   
// These permissions apply to all shared system extensions   
grant codeBase “file:${java.home}/jre/lib/ext/-” {   
permission java.security.AllPermission;   
};   
// These permissions apply to javac when ${java.home] points at $JAVA_HOME/jre   
grant codeBase “file:${java.home}/../lib/-” {   
permission java.security.AllPermission;   
};   
// These permissions apply to all shared system extensions when   
// ${java.home} points at $JAVA_HOME/jre   
grant codeBase “file:${java.home}/lib/ext/-” {   
permission java.security.AllPermission;   
};  
grant <security principal> { permission list... }; 
下面是catalina.policy中的一个片段: 
// These permissions apply to javac 
grant codeBase “file:${java.home}/lib/-” { 
permission java.security.AllPermission; 
}; 
// These permissions apply to all shared system extensions 
grant codeBase “file:${java.home}/jre/lib/ext/-” { 
permission java.security.AllPermission; 
}; 
// These permissions apply to javac when ${java.home] points at $JAVA_HOME/jre 
grant codeBase “file:${java.home}/../lib/-” { 
permission java.security.AllPermission; 
}; 
// These permissions apply to all shared system extensions when 
// ${java.home} points at $JAVA_HOME/jre 
grant codeBase “file:${java.home}/lib/ext/-” { 
permission java.security.AllPermission; 
}; 
这段代码赋予所有资源访问java编译器所有资源的权利 
view plaincopy to clipboardprint? 
// These permissions apply to the daemon code   
grant codeBase “file:${catalina.home}/bin/commons-daemon.jar” {   
permission java.security.AllPermission;   
};   
// These permissions apply to the logging API   
grant codeBase “file:${catalina.home}/bin/tomcat-juli.jar” {   
permission java.security.AllPermission;   
};   
// These permissions apply to the server startup code   
grant codeBase “file:${catalina.home}/bin/bootstrap.jar” {   
permission java.security.AllPermission;   
};   
// These permissions apply to the servlet API classes   
// and those that are shared across all class loaders   
// located in the “lib” directory   
grant codeBase “file:${catalina.home}/lib/-” {   
permission java.security.AllPermission;   
};  
// These permissions apply to the daemon code 
grant codeBase “file:${catalina.home}/bin/commons-daemon.jar” { 
permission java.security.AllPermission; 
}; 
// These permissions apply to the logging API 
grant codeBase “file:${catalina.home}/bin/tomcat-juli.jar” { 
permission java.security.AllPermission; 
}; 
// These permissions apply to the server startup code 
grant codeBase “file:${catalina.home}/bin/bootstrap.jar” { 
permission java.security.AllPermission; 
}; 
// These permissions apply to the servlet API classes 
// and those that are shared across all class loaders 
// located in the “lib” directory 
grant codeBase “file:${catalina.home}/lib/-” { 
permission java.security.AllPermission; 
}; 
这段代码将Server code,logging code以及API库的访问权限赋予所有资源。 
最后这组代码是有关web应用程序的默认权限的。与前面的不同,这里的限制更加严格,因为它们从没有获得java.security.AllPermission授权。 
第一部分是有关JDBC和JNDI的 
view plaincopy to clipboardprint? 
grant {   
// Required for JNDI lookup of named JDBC DataSource’s and   
// javamail named MimePart DataSource used to send mail   
permission java.util.PropertyPermission “java.home”, “read”;   
permission java.util.PropertyPermission “java.naming.*”, “read”;   
permission java.util.PropertyPermission “javax.sql.*”, “read”;  
grant { 
// Required for JNDI lookup of named JDBC DataSource’s and 
// javamail named MimePart DataSource used to send mail 
permission java.util.PropertyPermission “java.home”, “read”; 
permission java.util.PropertyPermission “java.naming.*”, “read”; 
permission java.util.PropertyPermission “javax.sql.*”, “read”; 
第二部分是授予对操作系统信息的读权限 
/view plaincopy to clipboardprint? 
/ OS Specific properties to allow read access   
permission java.util.PropertyPermission “os.name”, “read”;   
permission java.util.PropertyPermission “os.version”, “read”;   
permission java.util.PropertyPermission “os.arch”, “read”;   
permission java.util.PropertyPermission “file.separator”, “read”;   
permission java.util.PropertyPermission “path.separator”, “read”;   
permission java.util.PropertyPermission “line.separator”, “read”;  
/ OS Specific properties to allow read access 
permission java.util.PropertyPermission “os.name”, “read”; 
permission java.util.PropertyPermission “os.version”, “read”; 
permission java.util.PropertyPermission “os.arch”, “read”; 
permission java.util.PropertyPermission “file.separator”, “read”; 
permission java.util.PropertyPermission “path.separator”, “read”; 
permission java.util.PropertyPermission “line.separator”, “read”; 
第三部分代码赋予对一些JVM相关属性的读权限 
view plaincopy to clipboardprint? 
// JVM properties to allow read access   
permission java.util.PropertyPermission “java.version”, “read”;   
permission java.util.PropertyPermission “java.vendor”, “read”;   
permission java.util.PropertyPermission “java.vendor.url”, “read”;   
permission java.util.PropertyPermission “java.class.version”, “read”;   
permission java.util.PropertyPermission “java.specification.version”,   
“read”;   
permission java.util.PropertyPermission “java.specification.vendor”,   
“read”;   
permission java.util.PropertyPermission “java.specification.name”, “read”;   
permission java.util.PropertyPermission “java.vm.specification.version”,   
“read”;   
permission java.util.PropertyPermission “java.vm.specification.vendor”,   
“read”;   
permission java.util.PropertyPermission “java.vm.specification.name”,   
“read”;   
permission java.util.PropertyPermission “java.vm.version”, “read”;   
permission java.util.PropertyPermission “java.vm.vendor”, “read”;   
permission java.util.PropertyPermission “java.vm.name”, “read”;  
// JVM properties to allow read access 
permission java.util.PropertyPermission “java.version”, “read”; 
permission java.util.PropertyPermission “java.vendor”, “read”; 
permission java.util.PropertyPermission “java.vendor.url”, “read”; 
permission java.util.PropertyPermission “java.class.version”, “read”; 
permission java.util.PropertyPermission “java.specification.version”, 
“read”; 
permission java.util.PropertyPermission “java.specification.vendor”, 
“read”; 
permission java.util.PropertyPermission “java.specification.name”, “read”; 
permission java.util.PropertyPermission “java.vm.specification.version”, 
“read”; 
permission java.util.PropertyPermission “java.vm.specification.vendor”, 
“read”; 
permission java.util.PropertyPermission “java.vm.specification.name”, 
“read”; 
permission java.util.PropertyPermission “java.vm.version”, “read”; 
permission java.util.PropertyPermission “java.vm.vendor”, “read”; 
permission java.util.PropertyPermission “java.vm.name”, “read”; 
第四部分是有关JMX的 
view plaincopy to clipboardprint? 
// Required for OpenJMX   
permission java.lang.RuntimePermission “getAttribute”;  
// Required for OpenJMX 
permission java.lang.RuntimePermission “getAttribute”; 
最后这两部分是有关XML parser和预编译JSP的,在编码阶段经常使用 
view plaincopy to clipboardprint? 
// Allow read of JAXP compliant XML parser debug   
permission java.util.PropertyPermission “jaxp.debug”, “read”;   
// Precompiled JSPs need access to this package.   
permission java.lang.RuntimePermission   
“accessClassInPackage.org.apache.jasper.runtime”;   
permission java.lang.RuntimePermission   
“accessClassInPackage.org.apache.jasper.runtime.*”;};  
// Allow read of JAXP compliant XML parser debug 
permission java.util.PropertyPermission “jaxp.debug”, “read”; 
// Precompiled JSPs need access to this package. 
permission java.lang.RuntimePermission 
“accessClassInPackage.org.apache.jasper.runtime”; 
permission java.lang.RuntimePermission 
“accessClassInPackage.org.apache.jasper.runtime.*”;}; 
catalina.properties:更好的访问控制 
tocmat以安全模式启动时,最后加载的一个文件就是catalina.properties,这个文件允许管理员在java package(java 包)一级上进行权限控制。当有非法请求到达时,java package这一级的控制可以抛出SecurityException异常。 
在catalina.properties中的这几行代码定义了限制访问的包: 
view plaincopy to clipboardprint? 
package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,   
org.apache.jasper.,sun.beans.   
package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,   
org.apache.tomcat.,org.apache.jasper.  
package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat., 
org.apache.jasper.,sun.beans. 
package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote., 
org.apache.tomcat.,org.apache.jasper. 
这几行定义了comon,server和shared的类加载器的路径: 
view plaincopy to clipboardprint? 
common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar   
server.loader=   
shared.loader=  
common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar 
server.loader= 
shared.loader= 
catalina.properties的最后一行开启了string cache的使用。这个cache将在ByteChunk.toString()和CharChunk.toString()方法中使用 
tomcat.util.buf.StringCache.byte.enabled=true 
配置(Configuration)和管理(management)的不同 
简单地说,配置是在Tomcat启动之前进行的,而管理则是在Tomcat运行过程中进行的。 

posted on 2013-03-14 15:17  奉陪了  阅读(322)  评论(0)    收藏  举报