鍍金池/ 教程/ Linux/ 默認(rèn) Servlet
連接器
JSPs
重寫機(jī)制
CGI
Tomcat Manager
Windows 認(rèn)證
代理支持
虛擬主機(jī)
安全性注意事項(xiàng)
如何在 Maven 中使用 Tomcat 庫
安裝
MBean 描述符
JNDI 資源
類加載機(jī)制
Tomcat Web 應(yīng)用部署
基于 APR 的原生庫
負(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ā)人員,則沒有什么太大的用處。截止本文寫作時(shí),有用的值是 0、1、11、1000。默認(rèn)值為 0
listings 如果沒有歡迎文件,要不要顯示目錄列表?值可以是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 后綴名的文件,是可以訪問它們的,所以如果原始資源受安全挾制的保護(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 你可以通過contextXsltFile 來自定義你的目錄列表。這必須是一個(gè)上下文相對(duì)路徑(例如:/path/to/context.xslt),相對(duì)于帶有 .xsl.xslt 擴(kuò)展名的文件。它將覆蓋 globalXsltFile。如果提供了該值,但相對(duì)文件卻不存在,則將使用 globalXsltFile。如果 globalXsltFile 也不存在,則顯示默認(rèn)的目錄列表。
localXsltFile 你還可以在每個(gè)目錄通過配置 localXsltFile 定制你的目錄列表。它應(yīng)該是在產(chǎn)生列表的目錄里的一個(gè)相對(duì)路徑文件名。它覆蓋 globalXsltFilecontextXsltFile。如果該值存在,但是文件不存在,那么就使用 contextXsltFile。如果contextXsltFile 也不存在,那么就會(huì)使用 globalXsltFile。如果 globalXsltFile 也不存在,那么默認(rèn)的目錄列表就會(huì)被顯示出來。
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)來覆蓋 DefaultServlet,并將它用在 web.xml 聲明中。如果你能明白剛才所說的是什么意思,我們就認(rèn)為你能讀懂 DefaultServlet 的代碼并作出適當(dāng)?shù)恼{(diào)整。(如果不能明白,則說明這種方式不適合你。)

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)容。