在struts2中实现去掉后缀及url重写
2008-08-25 12:14
281 查看
首先,这要用到两个软件包,一个是SmartUrls(Struts2的插件,下载地址:http://code.google.com/p/smarturls-s2/downloads/list),还有就是urlrewritefilter(下载地址:http://tuckey.org/urlrewrite/dist/urlrewritefilter-2.6.zip).
要想去掉struts2的后缀,就要这样配置filter:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.texturemedia.smarturls.SmartURLsFilter</filter-class>
</filter>
用这个代替struts2的核心过滤器,FilterDispatcher。不必担心struts2不起作用了,因为这个过滤器是继承自FilterDispatcher的。同时在struts.properties中加入struts.action.extension= ,不设任何值。
然后就是配置UrlRewriteFilter,如下
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
在配置filter-mapping的时候,注意urlrewritefilter的应该在前面。然后urlrewritefilter的重写该怎么用大家可以参看文档,这里就不再赘述。
当使用时发现重写后,filterChain上只有一个urlrewritefilter,而没有经过smartUrls就发到了请求的资源,得到的自然是一个404错误。于是我参看urlrewritefilter的源代码发现,如果重写url成功的话,将会调用RequestDispatcher的forward方法转发到资源,而重写不成功或者是没有重写才会调用filterChain.dofilter。所以struts2的filter-mapping应该这样配置
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
然后就 OK 了
最后说明一点,这要在支持servlet2.4以上规范的容器中才气作用,因为servlet2.3规范里面,过滤器只支持request过滤,不支持转发之类的过滤
要想去掉struts2的后缀,就要这样配置filter:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.texturemedia.smarturls.SmartURLsFilter</filter-class>
</filter>
用这个代替struts2的核心过滤器,FilterDispatcher。不必担心struts2不起作用了,因为这个过滤器是继承自FilterDispatcher的。同时在struts.properties中加入struts.action.extension= ,不设任何值。
然后就是配置UrlRewriteFilter,如下
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
在配置filter-mapping的时候,注意urlrewritefilter的应该在前面。然后urlrewritefilter的重写该怎么用大家可以参看文档,这里就不再赘述。
当使用时发现重写后,filterChain上只有一个urlrewritefilter,而没有经过smartUrls就发到了请求的资源,得到的自然是一个404错误。于是我参看urlrewritefilter的源代码发现,如果重写url成功的话,将会调用RequestDispatcher的forward方法转发到资源,而重写不成功或者是没有重写才会调用filterChain.dofilter。所以struts2的filter-mapping应该这样配置
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
然后就 OK 了
最后说明一点,这要在支持servlet2.4以上规范的容器中才气作用,因为servlet2.3规范里面,过滤器只支持request过滤,不支持转发之类的过滤
相关文章推荐
- 使用RewritePath方法实现【不同路径+任意URL后缀重写到指定页面且URL地址不变】(附源码)_AX
- 关于Apache PHP实现无后缀名 URL重写
- [置顶] 利用Global.asax的Application_BeginRequest 实现url 重写 无后缀
- 使用IHttpHandler接口实现【不同路径+任意URL后缀重写到指定页面且URL地址不变】(附源码)_AX
- 对php工程的url进行重写(去掉.php文件后缀)
- 利用Global.asax的Application_BeginRequest 实现url 重写 无后缀
- 使用IHttpHandler接口实现【不同路径+任意URL后缀重写到指定页面且URL地址不变】(附源码)_AX
- asp.net用url重写URLReWriter实现任意二级域名(续)
- asp.net用url重写URLReWriter实现任意二级域名
- 在ASP.Net2.0中使用UrlRewritingNet实现链接重写
- ].net用url重写URLReWriter实现任意二级域名
- asp.net用url重写URLReWriter实现任意二级域名
- jsp 用urlrewrite 实现URL 重写
- asp.net用url重写URLReWriter实现任意二级域名
- asp.net下用url重写URLReWriter实现任意二级域名的方法第1/2页
- 【Struts2进阶】Struts2拦截器实现基于Url的权限管理
- 在ASP.NET中如何实现和利用URL重写
- 在ASP.NET中重写URL 方法四:在IIS5和IIS6中使用 ISAPIRewrite 来实现无扩展名的URL重写
- .NET4.0下web应用程序用UrlRewriter.dll重写无后缀路径