本文侧重在urlrewrite与struts2的结合配置时需要注意的地方,重点不在urlrewrite规则的具体配置。
如果对urlrewrite的配置想进行更深入的了解解,请查看下面链接
下面直接进入配置说明:
1、web.xml
在配置过滤器的时候,注意配置顺序,Struts2的过滤器要配置在UrlRewriteFilter过滤器后面。
什么时候配置以下三个 ?
<dispatcher>REQUEST</dispatcher> 默认配置,即不进行任何配置是使用的方式,过滤所有的非转发请求。
<dispatcher>FORWARD</dispatcher> 对FORWARD转发的请求进行过滤,比如在代码中有使用FORWARD转发时会进行二次过滤(因为第一次请求也会被过滤)。
<dispatcher>INCLUDE</dispatcher> 与FORWARD非常类似,惟一的不同在于:利用include将HTTP请求转送给其他Servlet后,被调用的Servlet虽然可以处理这个HTTP请求,但是最后的主导权仍然是在原来的Servlet。
所以如果你需要对经过FORWARD转发后的请求URL(例如要对经过Struts2转发后的URL进行包装,Struts2是通过FORWARD将请求参数转发到具体JSP文件的)与直接请求的URL进行处理,就仿照下面配置。
<!-- URL重定向 -->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<init-param>
<param-name>logLevel</param-name>
<param-value>sysout:DEBUG</param-value>
</init-param>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
因为UrlReWrite默认转发方式为FORWARD,所以要想让你的Struts2过滤器拦截到UrlReWrite转发的请求,必须在filter-mapping加上<dispatcher>FORWARD</dispatcher>
例如以下配置: <!-- STRUTS2 配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
注意:如果你有自己的权限验证filter,要想验证转发的URL是否拥有访问权限,也必须在 filter-mapping加上 <dispatcher>FORWARD</dispatcher>,否则你的filter将不对这进行拦截。
2、urlrewrite.xml
如果你不对urlrewrite的配置文件路径进行配置,其默认路径在WEB-INF下,与web.xml同目录
以下是一个简单示例,使用了wildcard与正则表达式进行配置,需要了解更详细具体配置方法请参考文章顶端的链接。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite
PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
"http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
<urlrewrite>
<!-- /user/blog/main.html - /blog/blog_main.htm?user.user_name=user -->
<rule match-type="wildcard">
<from>/*/blog/main.html*</from>
<to type="forward">/blog/blog_main.htm?user.user_name=$1</to>
</rule>
<!-- blog -->
<outbound-rule>
<from>/([a-zA-Z]+)/blog/blog_main.htm</from>
<to>/$1/blog/main.html</to>
</outbound-rule>
</urlrewrite>
如果还有什么配置上的疑问可以进行留言评论哦 ~