前言
整理这个官方翻译的系列,原因是网上大部分的 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
...
SSI
Server Side Includes (SSI) 是一种在 HTML 页面中放置的指令,在服务器上评估页面时执行。
它们允许您向现有的 HTML 页面添加动态生成的内容,而无需通过 CGI 程序或其他动态技术提供整个页面。
在 Tomcat 中,当您将 Tomcat 用作 HTTP 服务器并且需要 SSI 支持时,可以添加 SSI 支持。通常在开发期间进行这样的操作,当您不想运行诸如 Apache 等网络服务器时。
Tomcat 的 SSI 支持实现了与 Apache 相同的 SSI 指令。有关使用 SSI 指令的信息,请参阅 Apache SSI 介绍。
SSI 支持可作为 servlet 和过滤器提供。您应该使用其中一种来提供 SSI 支持,但不要同时使用两者。
基于 Servlet 的 SSI 支持是使用类 org.apache.catalina.ssi.SSIServlet 实现的。传统上,将此 servlet 映射到 URL 模式 "*.shtml"。
基于过滤器的 SSI 支持是使用类 org.apache.catalina.ssi.SSIFilter 实现的。传统上,将此过滤器映射到 URL 模式 ".shtml",尽管它可以映射到 "",因为它将基于 MIME 类型选择性地启用/禁用 SSI 处理。contentType 初始参数允许您将 SSI 处理应用于 JSP 页面、JavaScript 或任何其他您希望的内容。
默认情况下,Tomcat 中禁用了 SSI 支持。
安装
注意 - SSI 指令可用于执行Tomcat JVM 外部的程序。
要使用 SSI servlet,请从 $CATALINA_BASE/conf/web.xml 中删除围绕 SSI servlet 和 servlet-mapping 配置的 XML 注释。
要使用 SSI 过滤器,请从 $CATALINA_BASE/conf/web.xml 中删除围绕 SSI 过滤器和 filter-mapping 配置的 XML 注释。
只有标记为特权的上下文才能使用 SSI 功能(请参阅 Context 元素的 privileged 属性)。
Servlet 配置
有几个 servlet init 参数可用于配置 SSI servlet 的行为。
- buffered - 此 servlet 的输出是否应该被缓冲?(0=false, 1=true)默认值为 0(false)。
- debug - 此 servlet 记录的消息的调试详细级别。默认为 0。
- expires - 具有 SSI 指令的页面过期之前的秒数。默认行为是为每个请求评估所有 SSI 指令。
- isVirtualWebappRelative - "虚拟" SSI 指令路径是否应被解释为相对于上下文根,而不是服务器根?默认值为 false。
- inputEncoding - 如果无法从资源本身确定编码,则假定用于 SSI 资源的编码。默认为默认平台编码。
- outputEncoding - 用于 SSI 处理结果的编码。默认为 UTF-8。
- allowExec - 是否启用 exec 命令?默认为 false。
过滤器配置
有几个过滤器 init 参数可用于配置 SSI 过滤器的行为。
- contentType - 必须匹配的正则表达式模式,然后才能应用 SSI 处理。在构建自己的模式时,不要忘记 MIME 内容类型后面可能跟随的可选字符集,格式为 "mime/type; charset=set"。默认为 "text/x-server-parsed-html(;.*)?"。
- debug - 此过滤器记录的消息的调试详细级别。默认为 0。
- expires - 具有 SSI 指令的页面过期之前的秒数。默认行为是为每个请求评估所有 SSI 指令。
- isVirtualWebappRelative - "虚拟" SSI 指令路径是否应被解释为相对于上下文根,而不是服务器根?默认值为 false。
- allowExec - 是否启用 exec 命令?默认为 false。
指令
通过将 SSI 指令嵌入到由 SSI servlet 处理的 HTML 文档中来调用 Server Side Includes。指令采用 HTML 注释的形式。将指令替换为在将页面发送到客户端之前解释它的结果。指令的一般形式为:
xml
<!--#directive [param=value] -->
指令包括:
- config - 用于设置 SSI 错误消息、由 SSI 处理的文件大小和日期格式的 SSI 错误消息。
- echo - 将被变量的值替换。
- exec - 用于在主机系统上运行命令。
- include - 插入内容。
- flastmod - 返回文件上次修改的时间。
- fsize - 返回文件大小。
- printenv - 返回所有已定义变量的列表。
- set - 用于将值赋给用户定义的变量。
- if、elif、endif、else - 用于创建条件部分。
有关使用 SSI 指令的更多信息,请参阅 Apache SSI 介绍。
变量
SSI 变量通过 jakarta.servlet.ServletRequest 对象上的请求属性实现,并不限于 SSI servlet。以 "java."、"javax."、"sun" 或 "org.apache.catalina.ssi.SSIMediator." 开头的变量名称为保留变量,不能使用。
SSI servlet 当前实现了以下变量:
(变量名 - 描述)
-
AUTH_TYPE - 用户的身份验证类型:BASIC、FORM 等。
-
CONTENT_LENGTH - 从表单传递的数据的长度(以字节或字符数)。
-
CONTENT_TYPE - 查询数据的 MIME 类型,例如 "text/html"。
-
DATE_GMT - GMT 中的当前日期和时间。
-
DATE_LOCAL - 本地时区中的当前日期和时间。
-
DOCUMENT_NAME
-
当前文件。
-
DOCUMENT_URI - 文件的虚拟路径。
-
GATEWAY_INTERFACE - 服务器使用的通用网关接口的修订版本(如果已启用):"CGI/1.1"。
-
HTTP_ACCEPT - 客户端可以接受的 MIME 类型列表。
-
HTTP_ACCEPT_ENCODING - 客户端可以接受的压缩类型列表。
-
HTTP_ACCEPT_LANGUAGE - 客户端可以接受的语言列表。
-
HTTP_CONNECTION - 客户端连接管理方式:"Close" 或 "Keep-Alive"。
-
HTTP_HOST - 客户端请求的网站。
-
HTTP_REFERER - 客户端链接的文档的 URL。
-
HTTP_USER_AGENT - 客户端用于发出请求的浏览器。
-
LAST_MODIFIED - 当前文件的上次修改日期和时间。
-
PATH_INFO - 传递给 servlet 的额外路径信息。
-
PATH_TRANSLATED - 变量 PATH_INFO 的翻译版本。
-
QUERY_STRING - URL 中 "?" 后面的查询字符串。
-
QUERY_STRING_UNESCAPED - 所有已解码的查询字符串,其中所有 shell 元字符都已使用 "" 转义。
-
REMOTE_ADDR - 发出请求的用户的远程 IP 地址。
-
REMOTE_HOST - 发出请求的用户的远程主机名。
-
REMOTE_PORT - 发出请求的用户的远程 IP 地址的端口号。
-
REMOTE_USER - 用户的经过身份验证的名称。
-
REQUEST_METHOD - 发出信息请求的方法:"GET"、"POST" 等。
-
REQUEST_URI - 客户端最初请求的网页。
-
SCRIPT_FILENAME - 服务器上当前网页的位置。
-
SCRIPT_NAME - 网页的名称。
-
SERVER_ADDR - 服务器的 IP 地址。
-
SERVER_NAME - 服务器的主机名或 IP 地址。
-
SERVER_PORT - 服务器接收请求的端口号。
-
SERVER_PROTOCOL - 服务器使用的协议。例如,"HTTP/1.1"。
-
SERVER_SOFTWARE - 正在响应客户端请求的服务器软件的名称和版本。
-
UNIQUE_ID - 用于标识当前会话的令牌(如果已建立会话)。