转篇CSDN上的关于SSI的博,有些地方总结的非常不错。
转自:http://blog.csdn.net/silentbalanceyh/archive/2008/12/04/3444239.aspx
1. 简介:
SSI 全称( Server Side Includes )是在 HTML 静态页面中使用的指令,当页面在服务端执行的时候是可以进行服务端解析的。这种方式可以让我们在存在的 HTML 页面里面分块动态生成内容而不在整个执行了 CGI 等服务端技术的基础之上进行动态页面服务。在返回请求的页面(包含SSI指令)前,服务器会处理这些指令,并用处理的结果替换指令,然后把页面返回。我们使用 Tomcat 作为 Http 服务器的时候,我们需要使用 SSI 可以在 Tomcat 添加对 SSI 的支持。
Tomcat 服务器的 SSI 支持的实现方式和 Apache 里面的 SSI 指令一样,在 Tomcat 里面实现 SSI 支持使用的是一个 Servlet 和一个 Filter ( Servlet 和 Filter 的基本信息参考 JSP 教程),我们可以使用其中一种方式来进行 SSI 支持的配置,但是不需要两个同时配置,同时配置是否会产生冲突我不太清楚,一般情况下配置一个就可以了。
实现 SSI 支持的 Servlet 实现使用了 org.apache.catalina.ssi.SSIServlet ,另外需要在 Servlet 的路径解析里面添加映射规则“ *.shtml ”。
实现 SSI 支持的 Filter 使用了 org.apache.calalina.ssi.SSIFilter 。另外,在 Filter 路径解析里面也需要添加映射规则“ *.shtml ”,而且在 Filter 配置的时候需要在映射规则里面添加能够执行的 mime type , contentType 的初始化参数允许你执行服务器下边的资源。在 Tomcat 里面默认是禁用了 SSI 的。
注意: SSI 指令执行 Tomcat 外部的 JVM ,如果我们使用 Java 的安全管理器需要在 calalina.policy 文件里面进行配置。若要使用 SSI Servlet 和 SSI Filter ,直接在服务器的路径 $CATALINA_BASE/conf/web.xml 文件里面将 SSI 的注释去掉。需要注意的是在 Tomcat 服务器里面仅仅只有标记了 privileged 的 Context 可以使用 SSI 功能。( * :当 privileged 设置为 true 的时候,才允许 Tomcat 的 Web 应用使用容器内的 Servlet , Tomcat 的文档里面讲了使用的 lib 的域,每个应用程序如果不设置这个属性,是不能访问容器内的 Servlet 的,这里应该指代的是全局的 Servlet )
否则这里会遇到异常:
java.lang.SecurityException: Filter of class org.apache.catalina.ssi. SSIFilter (SSIServlet) is privileged and cannot be loaded by this web application
2. 服务器配置属性:
在配置 SSI Servlet 的时候需要用到的参数( init parameters )如下:
buffered :是需要将输入保存到缓冲区( 0=false,1=true )默认是 0 ( false )
debue :配置调试日志的记录级别,默认 0 ;
expires : SSI 包含某个页面的超时配置,默认行为是所有的 SSI 指令在每一次请求中执行
isVirtualWebappRelative :是针对 Tomcat Context 的根目录(虚拟目录)进行相对路径解析还是针对 Tomcat 的服务器目录进行相对路径解析( 0=false,1=true )默认是 0 ,不使用虚拟目录。
inputEncoding :如果资源不是自身的,资源来自于容器外部,可以针对外部资源进行编码的设置,以什么变法方式输入资源,默认使用的是资源所在平台使用的编码。
outputEncoding : SSI 执行结果输出的编码方式,默认是 UTF-8 的。
配置 SSI Filter 的时候需要使用以下参数( init paramters ):
contextType :配置一个可以匹配的正则表达式规则提供给 SSI 执行使用,若自定义自己的匹配规则,需要在 mime 类型里面配置下边的可选项:在 form 里面设置“ mime/type;charset=set ”默认的是“ text/x-server-parsed-html(;.*)? ”
debug :同上
expires :同上
isVirtualWebappRelative :同上
3. 指令描述 :
SSI 是被 HTML 文档内需要进行处理的包含部分的 SSI Servlet 调用的。这些指令是 HTML 文档的注释形式,这些指令在将内容发送到客户端之前进行内容的替换。标准格式如下:
<!--#directive [parm=value] -->
这些指令包括:
config : 设置日期格式一起被 SSI 处理的其他数据 ( <!--#config timefmt="%B %Y" --> )
echo : 将会被变量的值替换掉 ( <!--#echo var="VARIABLE_NAEM" --> )
exec : 用来执行服务器端的命令
include : 包含某些内容 ( <!--#include virtual="file-name" --> )
flastmod : 返回某个文件最后一次修改的时间 ( <!--#flastmod file="filename.shtml" --> )
fsize : 返回某个文件的大小 ( <!--#fzie file="filename.shtml" --> )
printenv : 返回所有定义的变量 (<!--#printenv -->)
set : 用来为定义的变量赋值 ( <!--#set var="foo" value="Bar" --> )
if elif endif else : 创建条件分支语句
4.SSI Servlet 里面的变量如下:
AUTH_TYPE ——针对用户的认证授权方式: BASIC , FORM , etc. 和 Tomcat 内的认证方式同步
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 提供的 translated 版本
QUERY_STRING ——在 URL 地址 ? 之后的请求参数列表
QUERY_STRING_UNESCAPED ——没有经过编码过的请求参数
REMOTE_ADDR ——用户请求客户端 IP 地址
REMOTE_HOST ——用户发送请求的主机名
REMOTE_PORT ——用户发送请求的端口号
REMOTE_USER ——认证授权需要的发送请求的用户名
REQUEST_METHOD ——请求使用方法: GET 或者 POST
REQUEST_URI ——客户端原来访问请求的 Web 页面的 URI 地址
SCRIPT_FILENAME ——在服务器上当前页面的地址
SCRIPT_NAME ——当前页面的名称
SERVER_ADDR ——服务器所在的 IP 地址
SERVER_NAME ——服务器的主机名或者 IP 地址
SERVER_PORT ——服务器接受请求的端口号
SERVER_PROTOCOL ——服务器处理请求的协议:“ HTTP/1.1 ”
SERVER_SOFTWARE ——服务器响应客户端请求的名称和版本号
UNIQUE_ID ——一旦创建链接过后每一次会话由服务器分配的唯一会话标识( 是不是 SessionID ?我不敢肯定,因为没有做过验证,有可能是有可能不是,不过有一点,此属性和直接和会话相关的。 )
5. 配置过程:
1). 先保证 Tomcat 可以运行,即能够正常启动
2). ( 5.x 版本)服务器根目录下边 $TOMCAT_HOME( 或者 $CATALINA_HOME)/server/lib/ 目录下边有一个文件:
servlets-ssi.renametojar ,将这个文件名更名为一个 jar 后缀,当然最方便的方法是直接改掉文件后缀,按照 Tomcat 扫描 jar 路径类的原理来讲,直接更名为 jar 应该也是可以的,不过我没尝试过,一般网上最常用的方法是改成: servlets-ssi.jar 。( 6.x 版本)服务器不需要去寻找 jar 文件了,直接进入下一步操作都可以。
3). 找到文件: $TOMCAT_HOME( 或者 $CATALINA_HOME)/conf/web.xml ,这里面不需要我们自己写入 SSI Servlet 和 SSI Filter 的配置,首先我们要选择使用哪种方式来配置:
Servlet 配置:
在这个文件里面,找到以下注释代码段,将注释代码段去掉:
Servlet 配置——
<!--
<servlet>
<servlet-name>ssi</servlet-name>
<servlet-class>
org.apache.catalina.ssi.SSIServlet
</servlet-class>
<init-param>
<param-name>buffered</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>expires</param-name>
<param-value>666</param-value>
</init-param>
<init-param>
<param-name>isVirtualWebappRelative</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
-->
ServletMapping 配置——
<!--
<servlet-mapping>
<servlet-name>ssi</servlet-name>
<url-pattern>*.shtml</url-pattern>
</servlet-mapping>
-->
Filter 配置:
Filter 的相关配置——
<!--
<filter>
<filter-name>ssi</filter-name>
<filter-class>
org.apache.catalina.ssi.SSIFilter
</filter-class>
<init-param>
<param-name>contentType</param-name>
<param-value>text/x-server-parsed-html(;.*)?</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>expires</param-name>
<param-value>666</param-value>
</init-param>
<init-param>
<param-name>isVirtualWebappRelative</param-name>
<param-value>0</param-value>
</init-param>
</filter>
-->
FilterMapping 相关配置——
<!--
<filter-mapping>
<filter-name>ssi</filter-name>
<url-pattern>*.shtml</url-pattern>
</filter-mapping>
-->
只是 Filter 配置里面还需要取消另外一个注释,下边的 MIME TYPE 的服务器支持相关注释
<!--
<mime-mapping>
<extension>shtml</extension>
<mime-type>text/x-server-parsed-html</mime-type>
</mime-mapping>
-->
上边的注释取消过后,配置就基本好了,在 Tomcat 5.x 的版本中配置的时候,到这个地步就结束了,但是在 Tomcat 6.x 版本中可能还会出现下边的异常:
java.lang.SecurityException: Filter of class org.apache.catalina.ssi. SSIFilter (SSIServlet) is privileged and cannot be loaded by this web application
4). 所以正对这点 6.x 还有一个步骤,在 $TOMCAT_HOME( 或者 $CATALINA_HOME)/conf/context.xml 文件中在 <Context> 结点添加一个属性 privileged="true" ,然后再启动就不会抛出上边的异常了。
5). 若要解决乱码问题,根据上边文档需要修改 SSI 中的启动参数:添加如下代码:
<init-param>
<param-name> inputEncoding </param-name>
<param-value> utf-8 </param-value>
</init-param>
<init-param>
<param-name> outputEncoding </param-name>
<param-value> utf-8 </param-value>
</init-param>
上边参数已经描述详细了:
6. 总结:
关于 Tomcat 环境下边的 SSI 的配置我就整理了这些,有什么有疑问的地方或者语法错误请指点,来信: silentbalanceyh@126.com