鍍金池/ 教程/ Linux/ 默認(rèn) Servlet
連接器
JSPs
重寫機(jī)制
CGI
Tomcat Manager
Windows 認(rèn)證
代理支持
虛擬主機(jī)
安全性注意事項(xiàng)
如何在 Maven 中使用 Tomcat 庫(kù)
安裝
MBean 描述符
JNDI 資源
類加載機(jī)制
Tomcat Web 應(yīng)用部署
基于 APR 的原生庫(kù)
負(fù)載均衡器
安全管理
附加組件
監(jiān)控與管理
Windows 服務(wù)
集群化與會(huì)話復(fù)制
高級(jí) IO 機(jī)制
SSI(服務(wù)器端嵌入)
WebSocket 支持
JDBC 數(shù)據(jù)源
日志機(jī)制
默認(rèn) Servlet
SSL/TLS 配置
Tomcat 的 JDBC 連接池
第一個(gè)應(yīng)用
簡(jiǎn)介
Realm 配置

默認(rèn) Servlet

什么是 DefaultSevelet

DefaultSevelet 是處理靜態(tài)資源的 Sevelet。

在什么位置聲明它?

它在 $CATALINA_HOME/conf/web.xml 中被全局聲明。默認(rèn)形式的聲明是這樣的: $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>

因此在默認(rèn)的情況下,默認(rèn) servlet 在 Web 應(yīng)用啟動(dòng)時(shí)被裝載,目錄列表可被使用,日志調(diào)試功能被關(guān)掉。

What can I Change?

DefaultServlet 允許設(shè)置以下初始化參數(shù):

屬性 描述
debug 調(diào)試級(jí)別。如果不是 tomcat 開發(fā)人員,則沒(méi)有什么太大的用處。截止本文寫作時(shí),有用的值是 0、1、11、1000。默認(rèn)值為 0
listings 如果沒(méi)有歡迎文件,要不要顯示目錄列表?值可以是true 或 false。
歡迎文件是servlet api的一部分。
警告:目錄列表中含有的很多項(xiàng)目都是非常消耗服務(wù)性能的,如果對(duì)大型目錄列表多次進(jìn)行請(qǐng)求,會(huì)嚴(yán)重消耗服務(wù)器資源。
gzip 如果某個(gè)文件存在gzip格式的文件(帶有gz后綴名的文件通常就在原始文件旁邊)。如果用戶代理支持 gzip 格式,并且啟用了該選項(xiàng),Tomcat 就會(huì)提供該格式文件的服務(wù)。默認(rèn)為 false。
如果直接請(qǐng)求帶有 gz 后綴名的文件,是可以訪問(wèn)它們的,所以如果原始資源受安全挾制的保護(hù),則 gzip 文件也同樣是受保護(hù)的。
readmeFile 如果提供了目錄列表,那么可能也會(huì)提供隨帶的 readme 文件。這個(gè)文件是被插入的,因此可能會(huì)包含 HTML。默認(rèn)值是null。
globalXsltFile 如果你希望自定義目錄列表,你可以使用一個(gè) XSL 轉(zhuǎn)換(transformation)。這個(gè)值是一個(gè)可用于所有目錄列表的相對(duì)路徑文件名(既相對(duì)于 CATALINA_BASE/conf/ 也相對(duì)于 $CATALINA_HOME/conf/)。》這可以每個(gè)上下文或每一目錄》可參看下面介紹的 contextXsltFilelocalXsltFile。該 xml 文件的格式會(huì)在下文介紹。
contextXsltFile 你可以通過(guò)contextXsltFile 來(lái)自定義你的目錄列表。這必須是一個(gè)上下文相對(duì)路徑(例如:/path/to/context.xslt),相對(duì)于帶有 .xsl.xslt 擴(kuò)展名的文件。它將覆蓋 globalXsltFile。如果提供了該值,但相對(duì)文件卻不存在,則將使用 globalXsltFile。如果 globalXsltFile 也不存在,則顯示默認(rèn)的目錄列表。
localXsltFile 你還可以在每個(gè)目錄通過(guò)配置 localXsltFile 定制你的目錄列表。它應(yīng)該是在產(chǎn)生列表的目錄里的一個(gè)相對(duì)路徑文件名。它覆蓋 globalXsltFilecontextXsltFile。如果該值存在,但是文件不存在,那么就使用 contextXsltFile。如果contextXsltFile 也不存在,那么就會(huì)使用 globalXsltFile。如果 globalXsltFile 也不存在,那么默認(rèn)的目錄列表就會(huì)被顯示出來(lái)。
input 在讀取用于服務(wù)的資源時(shí)的輸入緩沖大?。ㄒ宰止?jié)計(jì))。默認(rèn)為 2048。
output 在修改用于服務(wù)的資源時(shí)的輸出緩沖大?。ㄒ宰止?jié)計(jì))。默認(rèn)為 2048。
readonly 上下文是否為“只讀”,從而拒絕執(zhí)行 PUT 或 DELETE 這樣的 HTTP 命令。默認(rèn)為 true。
fileEncoding 文件編碼用于讀取靜態(tài)資源時(shí)。默認(rèn)取平臺(tái)默認(rèn)值。
sendfileSize 如果所用的連接器支持 sendfile,這個(gè)參數(shù)表示所用的 sendfile 最小的文件大?。ㄒ?KB 計(jì))。使用負(fù)數(shù)往往表示可以禁止使用 sendfile。默認(rèn)為 48。
useAcceptRanges 如果為 true,則將設(shè)置 Accept-Ranges 報(bào)頭,在適于響應(yīng)時(shí)。
showServerInfo 當(dāng)使用目錄列表,服務(wù)器信息是否應(yīng)該提供給發(fā)往客戶端的響應(yīng)中。默認(rèn)為 true。

我該如何自定義目錄列表

你可以用自定義實(shí)現(xiàn)來(lái)覆蓋 DefaultServlet,并將它用在 web.xml 聲明中。如果你能明白剛才所說(shuō)的是什么意思,我們就認(rèn)為你能讀懂 DefaultServlet 的代碼并作出適當(dāng)?shù)恼{(diào)整。(如果不能明白,則說(shuō)明這種方式不適合你。)

localXsltFileglobalXsltFile

格式如下:

    <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>
  • 如果 type = 'dir',則 size 丟失。
  • Readme 是一個(gè) CDATA 項(xiàng)。

下面是一個(gè)能夠模仿 Tomcat 默認(rèn)行為的范例 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>

如何保證目錄列表的安全性

在每一個(gè)單獨(dú)的 Web 應(yīng)用中使用 web.xml。可查看 Servlet 規(guī)范的安全性部分的內(nèi)容。