web server apache tomcat11-17-default-servlet

embedded/2024/10/18 18:26:39/

前言

整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。

开源项目

从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。

系列文章

web server apache tomcat11-01-官方文档入门介绍

web server apache tomcat11-02-setup 启动

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

...

DefaultServlet 是什么?

默认的 Servlet 是一个用于提供静态资源以及显示目录列表(如果启用了目录列表)的 Servlet。

声明位置

它在 $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>

因此,默认情况下,default servlet 在 web 应用程序启动时加载,目录列表被禁用,并且调试被关闭。

如何更改设置?

DefaultServlet 允许以下 initParameters:

属性描述
debug调试级别。除非您是 Tomcat 开发者,否则没有多大用处。截至目前,有用的值为 0、1、11。 [0]
listings如果没有欢迎文件,是否可以显示目录列表?值可以是 true 或 false [false]
precompressed如果存在文件的预压缩版本(文件名附加了 .br 或 .gz),并且用户代理支持匹配的内容编码(br 或 gzip),并且启用了此选项,则 Tomcat 将提供预压缩文件。 [false]
readmeFile如果显示目录列表,则也可以显示 readme 文件。此文件会原样插入,因此它可能包含 HTML。
globalXsltFile如果要自定义目录列表,可以使用 XSL 转换。此值是一个相对文件名(到 $CATALINA_BASE/conf/ 或 $CATALINA_HOME/conf/),将用于所有目录列表。此设置可以针对每个上下文和/或每个目录进行覆盖。见下文的 contextXsltFile 和 localXsltFile。
contextXsltFile您还可以通过配置 contextXsltFile 来根据上下文自定义目录列表。这必须是一个上下文相对路径(例如:/path/to/context.xslt),指向具有 .xsl 或 .xslt 扩展名的文件。这会覆盖 globalXsltFile。如果此值存在但文件不存在,则将使用 globalXsltFile。如果 globalXsltFile 不存在,则将显示默认目录列表。
localXsltFile您还可以通过配置 localXsltFile 来根据目录自定义目录列表。这必须是目录列表所在目录中具有 .xsl 或 .xslt 扩展名的文件。这会覆盖 globalXsltFile 和 contextXsltFile。如果此值存在但文件不存在,则将使用 contextXsltFile。如果 contextXsltFile 不存在,则将使用 globalXsltFile。如果 globalXsltFile 不存在,则将显示默认目录列表。
input在读取要提供的资源时的输入缓冲区大小(以字节为单位)。 [2048]
output在写入要提供的资源时的输出缓冲区大小(以字节为单位)。 [2048]
readonly此上下文是否为“只读”,因此会拒绝像 PUT 和 DELETE 这样的 HTTP 命令? [true]
fileEncoding在读取静态资源时要使用的文件编码。 [platform default]
useBomIfPresent如果静态文件包含字节顺序标记(BOM),是否应该优先使用它来确定文件编码,而不是 fileEncoding。此设置必须是 true(删除 BOM 并优先使用它而不是 fileEncoding)、false(删除 BOM 但不使用它)或 pass-through(不使用 BOM 并且不删除它)。 [true]
sendfileSize如果使用的连接器支持 sendfile,这表示将使用 sendfile 的最小文件大小(以 KiB 为单位)。使用负值始终禁用 sendfile。 [48]
useAcceptRanges如果为真,则会在响应适当时设置 Accept-Ranges 标头。 [true]
showServerInfo在启用目录列表时,是否应向客户端发送响应中呈现服务器信息。 [true]
sortListings服务器是否应该对目录中的列表进行排序。 [false]
sortDirectoriesFirst服务器是否应该在所有文件之前列出所有目录。 [false]
allowPartialPut服务器是否应将具有 Range 标头的 HTTP PUT 请求视为部分 PUT?请注意,虽然 RFC 7233 澄清了 Range 标头仅对 GET 请求有效,但 RFC 9110(废除了 RFC 7233)现在允许部分 PUT。 [true]
directoryRedirectStatusCode当进行目录重定向(缺少尾部斜杠)时,使用此作为 HTTP 响应代码。 [302]

(部分属性已省略)

如何自定义目录列表?

您可以使用 localXsltFilecontextXsltFileglobalXsltFile,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>

一个例子:

<?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。请参阅 Servlet 规范的安全部分。


http://www.ppmy.cn/embedded/16943.html

相关文章

使用 Flask 和 WTForms 构建一个用户注册表单

在这篇技术博客中&#xff0c;我们将使用 Flask 和 WTForms 库来构建一个用户注册表单。我们将创建一个简单的 Flask 应用&#xff0c;并使用 WTForms 定义一个注册表单&#xff0c;包括用户名、密码、确认密码、邮箱、性别、城市和爱好等字段。我们还将为表单添加验证规则&…

Elasticsearch索引中数据的增删改查与并发控制

Elasticsearch提供了丰富的REST API接口&#xff0c;使得用户能够便捷地对索引映射中的数据进行增删改查操作。本文将通过示例演示这些操作方法&#xff0c;同时介绍如何利用乐观锁进行并发控制&#xff0c;以及如何实现索引数据的批量写入。 使用REST端点对索引映射中的数据进…

Maven实战—搭建微服务 Maven 工程架构

需求案例&#xff1a;搭建一个电商平台项目&#xff0c;该平台包括用户服务、订单服务、通用工具模块等。 项目架构&#xff1a; 用户服务&#xff1a;负责处理用户相关的逻辑&#xff0c;例如用户信息的管理、用户注册、登录等。订单服务&#xff1a;负责处理订单相关的逻辑…

华为P系列“砍了”,三角美学系列全新登场

2021 年 10 月&#xff0c;Intel 正式带来了颠覆以往的第 12 代酷睿「混合架构」 CPU。 不知道是良心发现还是为了弥补 11 代酷睿过于拉胯表现&#xff0c;Intel 终于把狠活儿都用在了这代。 全新 Intel 7 工艺、全新架构、单核与多核性能大幅提升&#xff0c;让大家十分默契…

Android Studio实现内容丰富的安卓养老平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 158安卓养老 1.开发环境 后端用springboot框架&#xff0c;安卓的用android studio开发android stuido3.6 jak1.8 idea mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登…

React 之 函数式组件(二)

React的函数式组件是React组件的一种形式&#xff0c;它使用JavaScript函数而不是类来定义组件。这种组件形式在React 16.8版本引入Hooks之后变得特别流行&#xff0c;因为它使得组件逻辑更加简洁、易于理解和测试。 import React from react; function Welcome(props) { //…

HttpURLConnection 接收长字符串时出现中文乱码出现问号��

HttpURLConnection 接收长字符串的时候随机位置出现中文乱码&#xff0c;显示问号&#xff0c;究其原因是utf8解码长度问题&#xff0c;程序上写法需要注意&#xff0c;要把字节全部读进来一起转码&#xff0c;不能边读取边转码&#xff0c;会截断中文的字节码&#xff0c;导致…

水仙花数-第12届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第56讲。 水仙花数&#xf…