手册
由于历史原因,旧版系统采用的struts2框架。基于Action命名以及菜单规范的问题,故临时采用了额Url Rewrite相关功能实现。
本文档基本3.2.0版本。原文请参阅:http://tuckey.org/urlrewrite/manual/3.2/index.html
timg.jpg
部署
下载zip并将解压,把urlrewrite.xml放到项目WEB-INF目录下。 把下面的代码添加到WEB-INF/web.xml中:
代码语言:javascript复制<!-- 伪静态转发 -->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
<init-param>
<description>是否可以重新载入</description>
<param-name>confReloadCheckEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>设置配置文件重新加载的间隔时间,以秒计。必须是一个合法的整数(0表示每次修改都检查,-1表示不做重新加载检查)</description>
<param-name>confReloadCheckInterval</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
注:设置logLevel为log4j或者commons将导致日志构建时调用log4j或commons-loggin类库。因此,需要把相关jar引入到classpath中。
过滤器参数
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
</filter-class>
<!-- 设置配置文件重新加载的间隔时间,以秒计,必须是一个合法的整数(0表示每次修改都检查,-1表示不做重新加载检查,默认为-1) -->
<!-- 源码中默认值为0 -->
<init-param>
<param-name>confReloadCheckInterval</param-name>
<param-value>60</param-value>
</init-param>
<!-- 如果需要求给配置文件的路径,可以通过confPath参数,路径相对于上下文跟目录(默认为/WEB-INF/urlrewrite.xml) -->
<init-param>
<param-name>confPath</param-name>
<param-value>/WEB-INF/urlrewrite.xml</param-value>
</init-param>
<!-- 设置日志级别,可选值为 TRACE, DEBUG, INFO(默认), WARN, ERROR, FATAL; 日志系统可选 log4j,
commons, slf4j; -->
<init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<!-- 你可以修改urlrewrite状态数据的目录,以便它不与你已部署的应用相冲突(注:默认为/rewrite-status) ,注:必须以/开头 -->
<init-param>
<param-name>statusPath</param-name>
<param-value>/status</param-value>
</init-param>
<!-- 可以禁用状态页面,可选值为true/false,(默认为true) -->
<init-param>
<param-name>statusEnabled</param-name>
<param-value>true</param-value>
</init-param>
<!-- 你可能想允许其他的host也可以看到状态页,可以用statusEnabledOnHosts参数来配置,值为,隔开的host列表,可使用*号通配符(默认为"localhost,
local, 127.0.0.1") -->
<init-param>
<param-name>statusEnabledOnHosts</param-name>
<param-value>localhost, dev.*.myco.com, *.uat.mycom.com
</param-value>
</init-param>
<!-- 默认false. 使用mod_rewrite风格的配置文件(若设置为true,则confPath没有被指定时会会设置为/WEB-INF/.htaccess) -->
<init-param>
<param-name>modRewriteConf</param-name>
<param-value>false</param-value>
</init-param>
<!-- 从参数modRewriteConfText中加载mod_rewrite风格的配置信息,注:如果调协这了个参数,其他的默认参数将被忽略
<init-param>
<param-name>modRewriteConfText</param-name>
<param-value>
RewriteRule ^/~([^/] )/?(.*) /u/$1/$2 [R]
RewriteRule ^/([uge])/([^/] )$ /$1/$2/ [R]
</param-value>
</init-param>
-->
<!-- 默认为false, 允许通过访问下面的url设置使用哪个配置文件/rewrite-status/?conf=/WEB-INF/urlrewrite2.xml。仅为测试方便而设计
<init-param>
<param-name>allowConfSwapViaHttp</param-name>
<param-value>false</param-value>
</init-param>
-->
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
配置文件
代码语言:javascript复制<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<!-- 资源推送部分 -->
<rule>
<from>^/resource/resource_list.html</from>
<to>/resource/resource_list.jsp?type=0</to>
</rule>
<!--默认是正则匹配 match-type="wildcard" 通配符匹匹配 -->
<rule match-type="wildcard">
<!-- 预支付 -->
<from>/pay/prepay/*</from>
<to>/pay_prepay.action?studentId=$1</to>
</rule>
</urlrewrite>
urlrewrite.xml 这个配置文件一定只能放在 WEB-INF 下。
所谓重写,就一定会有规则的匹配,这里用到了正则表达式,方便起见,我只用了[A-Za-z0-9] ,简单的解释一下:
A-Z:匹配 A 到 Z 中的任意一个字符,说一句废话,同理可得,
a-z:匹配 a 到 z 中的任意一个字符
0-9:匹配 0 到 9 的任意一个字符
:至少出现一次,即,一次或一次以上
合起来 [A-Za-z0-9] 的意思就是:匹配一个任意的英文字母和数字组合的字符串
rule:自定义匹配规则
note:注释,解释标签
from:定义具体的匹配规则
to:匹配成功后的目标地址
type:type的值有两个,一个是 forward (转发,参数不丢失),一个是 redirect (重定向,地址栏显示的地址就是目标真实地址)
$1:匹配中的第一个正则表达式的字符串的值,$2,$3,$4....也是如此
& amp; :是 & 的实体名,代表的就是 &。
源码
截取过滤器部分源码,便于大家理解。 org.tuckey.web.filters.urlrewrite.UrlRewriteFilter:
代码语言:javascript复制public class UrlRewriteFilter implements Filter {
private static Log log = Log.getLog(UrlRewriteFilter.class);
public static final String VERSION = "3.2.0";
public static final String DEFAULT_WEB_CONF_PATH = "/WEB-INF/urlrewrite.xml";
private UrlRewriter urlRewriter;
private boolean confReloadCheckEnabled;
private int confReloadCheckInterval;
private boolean allowConfSwapViaHttp;
private long confLastLoad;
private Conf confLastLoaded;
private long confReloadLastCheck;
private boolean confLoadedFromFile;
private String confPath;
private boolean confReloadInProgress;
private boolean statusEnabled;
private String statusPath;
private boolean modRewriteStyleConf;
public static final String DEFAULT_MOD_REWRITE_STYLE_CONF_PATH = "/WEB-INF/.htaccess";
private ServerNameMatcher statusServerNameMatcher;
private static final String DEFAULT_STATUS_ENABLED_ON_HOSTS = "localhost, local, 127.0.0.1";
private ServletContext context;
更多:http://www.gaofi.cn/article/detail/84