SSI(服务器端嵌入)是一组放在 HTML 页面中的指令,当服务器向客户端访问提供这些页面时,会解释执行这些指令。它们能为已有的 HTML 页面添加动态生成内容,不需要通过 CGI 程序来或其他的动态技术来重新改变整个页面。
如果利用 Tomcat 作为 HTTP 服务器并需要 SSI 支持时,可以添加 SSI 支持。通常,如果你运行的不是像 Apache 那样的服务器,就通过开发来实现这种支持。
Tomcat 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 之外的程序。如果使用 Java SecurityManager,它会绕过你在catalina.policy
中配置的安全策略。
为了使用 SSI servlet,要从 $CATALINA_BASE/conf/web.xml
中去除 SSI servlet 及 servlet 映射配置旁边的 XML 注释。
为了使用 SSI 过滤器,要从 $CATALINA_BASE/conf/web.xml
中去除 SSI 过滤器及过滤器映射配置旁边的 XML 注释。
只有标明为 privileged 的上下文才可以使用 SSI 功能。
以下这些 servlet 初始化参数可以配置 SSI servlet 的行为:
exec
命令?默认为 false。
以下这些过滤器初始化参数可以配置 SSI 过滤器的行为:
exec
命令?默认为 false。
指令采取 HTML 注释的形式。在将页面发送到客户端之前,解读指令,并用所得结果来替换指令。指令的一般形式为:
<!--#directive [parm=value] -->
这些指令包括:
<!--#config timefmt="%B %Y" -->
用于设定日期格式以及其他一些 SSI 处理的项目。
<!--#echo var="VARIABLE_NAME" -->
将被变量值所取代。
<!--#include virtual="file-name" -->
插入内容。
<!--#flastmod file="filename.shtml" -->
返回文件最后修改的时间。
<!--#fsize file="filename.shtml" -->
返回文件大小。
<!--#printenv -->
返回所有定义变量的列表。
<!--#set var="foo" value="Bar" -->
为用户自定义变量赋值。
<!--#config timefmt="%A" -->
<!--#if expr="$DATE_LOCAL = /Monday/" -->
<p>Meeting at 10:00 on Mondays</p>
<!--#elif expr="$DATE_LOCAL = /Friday/" -->
<p>Turn in your time card</p>
<!--#else -->
<p>Yoga class at noon.</p>
<!--#endif -->
变量
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)的修订版本,比如: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 | 用于识别当前会话(如果存在)的令牌 |