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

目次

デフォルトサーブレットとは

デフォルトサーブレットは、静的リソースを提供するだけでなく、(ディレクトリ一覧が有効になっている場合)ディレクトリ一覧も提供するサーブレットです。

どこに宣言されていますか?

これは、$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-INF/web.xmlでデフォルトサーブレットを再定義することで、デフォルト設定をオーバーライドできます。ただし、デフォルトサーブレットクラスが認識されないため、他のコンテナにアプリケーションをデプロイしようとすると問題が発生します。この問題を回避するには、Tomcat固有の/WEB-INF/tomcat-web.xmlデプロイメント記述子を使用できます。形式は/WEB-INF/web.xmlと同じです。デフォルト設定をオーバーライドしますが、/WEB-INF/web.xmlの設定はオーバーライドしません。Tomcat固有であるため、アプリケーションがTomcatにデプロイされた場合にのみ処理されます。

何が変更できますか?

デフォルトサーブレットは、次のinitパラメータを許可します。

プロパティ説明
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ディレクトリ一覧をカスタマイズする場合は、XSLT変換を使用できます。この値は、すべてのディレクトリ一覧に使用される相対ファイル名($CATALINA_BASE/conf/または$CATALINA_HOME/conf/のいずれか)です。これはコンテキストごとおよび/またはディレクトリごとにオーバーライドできます。以下のcontextXsltFilelocalXsltFileを参照してください。XMLの形式を以下に示します。
contextXsltFileコンテキストごとにディレクトリ一覧をカスタマイズするには、contextXsltFileを設定します。これは、.xslまたは.xslt拡張子のファイルへのコンテキスト相対パス(例:/path/to/context.xslt)である必要があります。これはglobalXsltFileをオーバーライドします。この値が存在するがファイルが存在しない場合、globalXsltFileが使用されます。globalXsltFileが存在しない場合、デフォルトのディレクトリ一覧が表示されます。
localXsltFileディレクトリごとにディレクトリ一覧をカスタマイズするには、localXsltFileを設定します。これは、一覧が表示されるディレクトリにある.xslまたは.xslt拡張子のファイルである必要があります。これはglobalXsltFilecontextXsltFileをオーバーライドします。この値が存在するがファイルが存在しない場合、contextXsltFileが使用されます。contextXsltFileが存在しない場合、globalXsltFileが使用されます。globalXsltFileが存在しない場合、デフォルトのディレクトリ一覧が表示されます。
input提供されるリソースの読み込み時の入力バッファサイズ(バイト単位)。[2048]
output提供されるリソースの書き込み時の出力バッファサイズ(バイト単位)。[2048]
readonlyこのコンテキストは「読み取り専用」ですか?そのため、PUTやDELETEなどのHTTPコマンドは拒否されますか?[true]
fileEncoding静的リソースの読み込み時に使用するファイルエンコーディング。[プラットフォームのデフォルト]
useBomIfPresent静的ファイルにバイトオーダーマーク(BOM)が含まれている場合、fileEncodingよりも優先してファイルエンコーディングを決定するためにこれを使用する必要がありますか?この設定は、true(BOMを削除し、fileEncodingよりも優先して使用)、false(BOMを削除するが使用しない)、またはpass-through(BOMを使用せず、削除もしない)のいずれかである必要があります。[true]
sendfileSize使用されているコネクタがsendfileをサポートしている場合、sendfileが使用される最小ファイルサイズ(KiB単位)。sendfileを常に無効にするには、負の値を使用します。[48]
useAcceptRangestrueの場合、レスポンスに適した場合はAccept-Rangesヘッダーが設定されます。[true]
showServerInfoディレクトリ一覧が有効になっている場合、クライアントに送信されるレスポンスにサーバー情報を表示する必要がありますか?[true]
sortListingsサーバーがディレクトリ内のリストをソートする必要がありますか?[false]
sortDirectoriesFirstサーバーがすべてのディレクトリをすべてのファイルの前にリストする必要がありますか?[false]
allowPartialPutサーバーがRangeヘッダー付きのHTTP PUTリクエストを部分的なPUTとして扱う必要がありますか?RFC 7233ではRangeヘッダーはGETリクエストに対してのみ有効であることが明確化されていましたが、RFC 9110(RFC 7233を廃止する)では部分的なPUTが許可されるようになりました。[true]

ディレクトリ一覧をカスタマイズするにはどうすればよいですか?

独自のインプリメンテーションでデフォルトサーブレットをオーバーライドし、web.xml宣言で使用できます。上記の内容を理解できる場合は、デフォルトサーブレットのコードを読み、適切な調整を行うことができると仮定します。(そうでない場合は、その方法はあなたのためではありません)

localXsltFilecontextXsltFile、またはglobalXsltFileのいずれかを使用でき、デフォルトサーブレットはXMLドキュメントを作成し、XSLTファイルに提供された値に基づいてXSLT変換を実行します。最初に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'の場合、サイズは欠落します。
  • ReadmeはCDATAエントリです。

以下は、デフォルトのTomcat動作を模倣するサンプルXSLTファイルです。

<?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/10.1</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.xmlを使用します。サーブレット仕様のセキュリティセクションを参照してください。