通常来讲,使用struts以后url的访问实际上访问的是action的地址,为了避免让该地址暴露给别人,能够采用UrlRewriteFilter来对url进行重写。html
首先,在web.xml里面配置:web
<filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> <init-param> <param-name>confReloadCheckInterval</param-name> <param-value>60</param-value> </init-param> <init-param> <param-name>confPath</param-name> <param-value>/WEB-INF/urlrewrite.xml</param-value> </init-param> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <url-pattern>/*</url-pattern> </filter-mapping>
注意,要在struts的mapping里面加上,要否则会出错的!这个花了我半天才搞定。还有一点:UrlRewriteFilter要放在struts Filter以前。web.xml里面过滤器须要讲究顺序,通常是这样子的顺序:字符编码过滤器,hibernate open session in view 过滤器,Urlrewrite过滤器,struts过滤器。正则表达式
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
而后在WEB-INF里面新建urlrewrite.xml文件,该文件为UrlRewriteFilter的配置文件,经过在里面定义rule规则对URL进行更替。
下面是urlrewrite.xml
<?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>/anything</from> <!-- 真实的请求地址 --> <to>/url/test.action</to> </rule> </urlrewrite>
以上只是简单的实现,具体的替换须要用到正则表达式。session
以下例:app
<from>/content/([0-9]+)/list</from> <to type="forward">/IssuedContentAction.do?dispatch=vContentListBySubid&scope=vmcontent&columninfoid=$1</to>
须要注意的地方是:用括号括起来的正则表达式为变量,如to标签里面的$1表示的是上面from里面的第一个括号内容。url里面的参数间隔符 ‘&’应该写为‘&’。编码
值得注意的是<outbound-rule>标签,能够使用该标签替换页面里面的url。url
简单的正则表达式:spa
. 匹配除换行符之外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束hibernate