DefaultSevelet 是處理靜態資源的 Sevelet。
它在 $CATALINA_HOME/conf/web.xml 中被全局聲明。默認形式的聲明是這樣的: $CATALINA_HOME/conf/web.xml
<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>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
因此在默認的情況下,默認 servlet 在 Web 應用啟動時被裝載,目錄列表可被使用,日志調試功能被關掉。
DefaultServlet 允許設置以下初始化參數:
屬性 |
描述 |
debug |
調試級別。如果不是 tomcat 開發人員,則沒有什么太大的用處。截止本文寫作時,有用的值是 0、1、11、1000。默認值為 0 |
listings |
如果沒有歡迎文件,要不要顯示目錄列表?值可以是true 或 false。 |
gzip |
如果某個文件存在gzip格式的文件(帶有gz后綴名的文件通常就在原始文件旁邊)。如果用戶代理支持 gzip 格式,并且啟用了該選項,Tomcat 就會提供該格式文件的服務。默認為 false。 |
readmeFile |
如果提供了目錄列表,那么可能也會提供隨帶的 readme 文件。這個文件是被插入的,因此可能會包含 HTML。默認值是null。 |
globalXsltFile |
如果你希望自定義目錄列表,你可以使用一個 XSL 轉換(transformation)。這個值是一個可用于所有目錄列表的相對路徑文件名(既相對于 CATALINA_BASE/conf/ 也相對于 $CATALINA_HOME/conf/)。》這可以每個上下文或每一目錄》可參看下面介紹的 contextXsltFile 和 localXsltFile。該 xml 文件的格式會在下文介紹。 |
contextXsltFile |
你可以通過contextXsltFile 來自定義你的目錄列表。這必須是一個上下文相對路徑(例如:/path/to/context.xslt),相對于帶有 .xsl 或 .xslt 擴展名的文件。它將覆蓋 globalXsltFile。如果提供了該值,但相對文件卻不存在,則將使用 globalXsltFile。如果 globalXsltFile 也不存在,則顯示默認的目錄列表。 |
localXsltFile |
你還可以在每個目錄通過配置 localXsltFile 定制你的目錄列表。它應該是在產生列表的目錄里的一個相對路徑文件名。它覆蓋 globalXsltFile 和 contextXsltFile。如果該值存在,但是文件不存在,那么就使用 contextXsltFile。如果contextXsltFile 也不存在,那么就會使用 globalXsltFile。如果 globalXsltFile 也不存在,那么默認的目錄列表就會被顯示出來。 |
input |
在讀取用于服務的資源時的輸入緩沖大小(以字節計)。默認為 2048。 |
output |
在修改用于服務的資源時的輸出緩沖大小(以字節計)。默認為 2048。 |
readonly |
上下文是否為“只讀”,從而拒絕執行 PUT 或 DELETE 這樣的 HTTP 命令。默認為 true。 |
fileEncoding |
文件編碼用于讀取靜態資源時。默認取平臺默認值。 |
sendfileSize |
如果所用的連接器支持 sendfile,這個參數表示所用的 sendfile 最小的文件大小(以 KB 計)。使用負數往往表示可以禁止使用 sendfile。默認為 48。 |
useAcceptRanges |
如果為 true,則將設置 Accept-Ranges 報頭,在適于響應時。 |
showServerInfo |
當使用目錄列表,服務器信息是否應該提供給發往客戶端的響應中。默認為 true。 |
你可以用自定義實現來覆蓋 DefaultServlet,并將它用在 web.xml 聲明中。如果你能明白剛才所說的是什么意思,我們就認為你能讀懂 DefaultServlet 的代碼并作出適當的調整。(如果不能明白,則說明這種方式不適合你。)
localXsltFile 或 globalXsltFile
格式如下:
<listing>
<entries>
<entry type='file|dir' urlPath='aPath' size='###' date='gmt date'>
fileName1
</entry>
<entry type='file|dir' urlPath='aPath' size='###' date='gmt date'>
fileName2
</entry>
...
</entries>
<readme></readme>
</listing>
下面是一個能夠模仿 Tomcat 默認行為的范例 xsl 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:output method="html" html-version="5.0"
encoding="UTF-8" indent="no"
doctype-system="about:legacy-compat"/>
<xsl:template match="listing">
<html>
<head>
<title>
Sample Directory Listing For
<xsl:value-of select="@directory"/>
</title>
<style>
h1 {color : white;background-color : #0086b2;}
h3 {color : white;background-color : #0086b2;}
body {font-family : sans-serif,Arial,Tahoma;
color : black;background-color : white;}
b {color : white;background-color : #0086b2;}
a {color : black;} HR{color : #0086b2;}
table td { padding: 5px; }
</style>
</head>
<body>
<h1>Sample Directory Listing For
<xsl:value-of select="@directory"/>
</h1>
<hr style="height: 1px;" />
<table style="width: 100%;">
<tr>
<th style="text-align: left;">Filename</th>
<th style="text-align: center;">Size</th>
<th style="text-align: right;">Last Modified</th>
</tr>
<xsl:apply-templates select="entries"/>
</table>
<xsl:apply-templates select="readme"/>
<hr style="height: 1px;" />
<h3>Apache Tomcat/<version-major-minor/></h3>
</body>
</html>
</xsl:template>
<xsl:template match="entries">
<xsl:apply-templates select="entry"/>
</xsl:template>
<xsl:template match="readme">
<hr style="height: 1px;" />
<pre><xsl:apply-templates/></pre>
</xsl:template>
<xsl:template match="entry">
<tr>
<td style="text-align: left;">
<xsl:variable name="urlPath" select="@urlPath"/>
<a href="{$urlPath}">
<pre><xsl:apply-templates/></pre>
</a>
</td>
<td style="text-align: right;">
<pre><xsl:value-of select="@size"/></pre>
</td>
<td style="text-align: right;">
<pre><xsl:value-of select="@date"/></pre>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
如何保證目錄列表的安全性
在每一個單獨的 Web 應用中使用 web.xml。可查看 Servlet 規范的安全性部分的內容。