デフォルトサーブレットリファレンス

目次

DefaultServletとは何か

デフォルトサーブレットは、静的リソースを提供し、ディレクトリリスト(ディレクトリリストが有効な場合)も提供するサーブレットです。

どこで宣言されているか?

それは$CATALINA_BASE/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>

したがって、デフォルトでは、デフォルトサーブレットはWebアプリケーションの起動時にロードされ、ディレクトリリストは無効になり、デバッグはオフになっています。

アプリケーションのDefaultServlet設定を変更する必要がある場合は、/WEB-INF/web.xmlでDefaultServletを再定義することでデフォルト設定をオーバーライドできます。ただし、DefaultServletクラスが認識されないため、別のコンテナにアプリケーションをデプロイしようとすると問題が発生します。この問題は、Tomcat固有の/WEB-INF/tomcat-web.xmlデプロイメントディスクリプタを使用することで回避できます。フォーマットは/WEB-INF/web.xmlと同一です。これはすべてのデフォルト設定をオーバーライドしますが、/WEB-INF/web.xml内の設定はオーバーライドしません。これはTomcat固有であるため、アプリケーションがTomcatにデプロイされた場合にのみ処理されます。

何を変更できるか?

DefaultServletは以下のinitParametersを許可します

プロパティ説明
debugデバッグレベル。Tomcat開発者でない限り、あまり有用ではありません。この記事の執筆時点では、有用な値は0、1、11です。[0]
listingsウェルカムファイルが存在しない場合、ディレクトリリストを表示できますか?値はtrueまたはfalseです。[false]
ウェルカムファイルはサーブレットAPIの一部です。
警告: 多数のエントリを含むディレクトリのリストは負荷が高いです。大規模なディレクトリリストに対する複数のリクエストは、サーバーリソースのかなりの部分を消費する可能性があります。
precompressedファイルの事前圧縮バージョンが存在する場合(元のファイルと同じ場所にあり、ファイル名に.brまたは.gzが付加されたファイル)、ユーザーエージェントが一致するコンテンツエンコーディング(brまたはgzip)をサポートし、このオプションが有効になっている場合、Tomcatは事前圧縮ファイルを配信します。[false]
.brまたは.gz拡張子を持つ事前圧縮ファイルは、直接リクエストされた場合にアクセス可能になります。そのため、元のリソースがセキュリティ制約で保護されている場合、事前圧縮バージョンも同様に保護される必要があります。
事前圧縮フォーマットのリストを設定することも可能です。構文は、[content-encoding]=[file-extension]ペアをコンマで区切ったリストです。例: br=.br,gzip=.gz,bzip2=.bz2。複数のフォーマットが指定され、クライアントが複数のフォーマットをサポートしているが、優先順位を表明しない場合、フォーマットリストの順序はサーバーの優先順序として扱われ、返されるフォーマットの選択に使用されます。
readmeFileディレクトリリストが表示される場合、readmeファイルもリストと一緒に表示されることがあります。このファイルはそのまま挿入されるため、HTMLを含むことができます。
globalXsltFileディレクトリリストをカスタマイズしたい場合は、XSL変換を使用できます。この値は、すべてのディレクトリリストに使用される相対ファイル名($CATALINA_BASE/conf/または$CATALINA_HOME/conf/のいずれかに対する)です。これはコンテキストごと、および/またはディレクトリごとにオーバーライドできます。以下のcontextXsltFileおよびlocalXsltFileを参照してください。XMLのフォーマットは以下に示されています。
contextXsltFilecontextXsltFileを設定することで、コンテキストごとにディレクトリリストをカスタマイズすることもできます。これは、.xslまたは.xslt拡張子を持つファイルへのコンテキスト相対パス(例: /path/to/context.xslt)である必要があります。これはglobalXsltFileをオーバーライドします。この値が存在してもファイルが存在しない場合、globalXsltFileが使用されます。globalXsltFileが存在しない場合、デフォルトのディレクトリリストが表示されます。
localXsltFilelocalXsltFileを設定することで、ディレクトリごとにディレクトリリストをカスタマイズすることもできます。これは、リストが表示されるディレクトリ内の.xslまたは.xslt拡張子を持つファイルである必要があります。これはglobalXsltFileおよびcontextXsltFileをオーバーライドします。この値が存在してもファイルが存在しない場合、contextXsltFileが使用されます。contextXsltFileが存在しない場合、globalXsltFileが使用されます。globalXsltFileが存在しない場合、デフォルトのディレクトリリストが表示されます。
input提供されるリソースを読み取る際の入力バッファサイズ(バイト単位)。[2048]
output提供されるリソースを書き込む際の出力バッファサイズ(バイト単位)。[2048]
readonlyこのコンテキストは「読み取り専用」ですか?PUTやDELETEなどのHTTPコマンドは拒否されますか?[true]
fileEncoding静的リソースを読み取る際に使用するファイルエンコーディング。[プラットフォームのデフォルト]
useBomIfPresent静的ファイルにバイトオーダーマーク(BOM)が含まれている場合、fileEncodingよりもBOMを使用してファイルエンコーディングを決定すべきですか?この設定は、true(BOMを削除し、fileEncodingよりも優先して使用)、false(BOMを削除するが使用しない)、またはpass-through(BOMを使用せず、削除しない)のいずれかである必要があります。[true]
sendfileSize使用されるコネクタがsendfileをサポートしている場合、これはsendfileが使用される最小ファイルサイズ(KiB単位)を表します。常にsendfileを無効にするには負の値を使用します。[48]
useAcceptRangestrueの場合、レスポンスに適宜Accept-Rangesヘッダーが設定されます。[true]
非推奨。このオプションはTomcat 12以降で、trueにハードコードされるため、代替なしで削除されます。
showServerInfoディレクトリリストが有効になっている場合、クライアントに送信されるレスポンスにサーバー情報が表示されるべきですか?[true]
sortListingsサーバーはディレクトリ内のリストをソートすべきですか?[false]
sortDirectoriesFirstサーバーはすべてのファイルをリストする前にすべてのディレクトリをリストすべきですか?[false]
allowPartialPutサーバーはContent-Rangeヘッダーを持つHTTP PUTリクエストを部分的なPUTとして扱うべきですか?RFC 7231ではContent-Rangeヘッダーフィールドを持つそのようなPUTは不正なリクエストであると明確にされていましたが、RFC 9110(RFC 7231を廃止)は現在部分的なPUTを許可していることに注意してください。[true]
directoryRedirectStatusCodeディレクトリリダイレクト(末尾のスラッシュがない場合)が行われたとき、これをHTTPレスポンスコードとして使用します。[302]
allowPostAsGetPOSTメソッドを使用した静的リソースへの直接リクエスト(つまり、フォワードやインクルードではない)が、GETメソッドが使用されたかのように処理されるかどうかを制御します。許可されない場合、リクエストは拒否されます。GETメソッドが使用されたかのようにリクエストを処理するデフォルトの動作は変更されていません。[true]

ディレクトリリストをカスタマイズするには?

DefaultServletを独自の*実装でオーバーライドし、それをweb.xmlの宣言で使用することができます。今述べたことが理解できるのであれば、DefaultServletサーブレットのコードを読み、適切な調整を行うことができると仮定します。(もしそうでない場合、その方法はあなたには向きません)

localXsltFilecontextXsltFile、またはglobalXsltFileのいずれかを使用でき、DefaultServletはXMLドキュメントを作成し、XSLTファイルで提供される値に基づいてXSL変換を実行します。localXsltFileが最初にチェックされ、次にcontextXsltFile、その後にglobalXsltFileがチェックされます。XSLTファイルが何も設定されていない場合、デフォルトの動作が使用されます。

フォーマット

    <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はCDATAエントリです

以下は、デフォルトの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/11.0</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を使用してください。サーブレット仕様のセキュリティセクションを参照してください。