最近有个需求,需要对项目的url进行规范,由于现有的url都是以.jsp结尾的,而且很多应用都在调用这个接口,所以只能保持原有的接口不变,而增加新的url,通过一定的映射来指向到旧的url。

    首先,很自然的就想到了使用Apache的UrlRewrite功能。  

    RewriteEngine  on
    RewriteRule  ^/test/index$ /index.jsp

    但实际的试验后,发现此方法行不通。因为Resin的mod_caucho模块只处理.jsp文件和servlet请求,而配置了UrlRewrite后,虽然url能重写了,但重写后的url却无法由resin处理了......

    上网Google了一把,发现了一个不错的东东,urlrewritefilter,是个开源的项目,专门在web application server中利用filter来实现url rewrite的。

    <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>
   </filter>
   <filter-mapping>
            <filter-name>UrlRewriteFilter</filter-name>
            <url-pattern>/test/*</url-pattern>
   </filter-mapping>

    下载安装后,如果只用Resin的话,运行很顺利,但如果和Apache协作起来,同样是有上面的问题。在urlrewrite.xml中配置的url rewrite根本无法处理(因为url首先被Apache给截取了).......

    继续Google,发现了Resin的一个隐蔽的配置,能将一个url配置成不由Apache处理,而是交给Resin来处理,在web.xml中增加:

    <servlet-mapping url-pattern='/test/*' servlet-name='plugin_match'/>

   这样的话,以/test/开头的url全部都交给了Resin来处理,然后由urlrewrite的filter进行重写,之后交给真正的jsp进行处理......

    至此上面的那个需求基本算是满足了.......