urlRewrite 这个东西随便一百度就有一堆,但是好多人都没有把它说很清楚
我作为一个初级程序员,看源码是不可能看懂的,英文文档的阅读能力有限
所以,我只能在实践中寻找答案
先说一下urlRewrite的简单配置
pom
<dependency>
<groupId>org.tuckey</groupId>
<artifactId>urlrewritefilter</artifactId>
<version>4.0.4</version>
</dependency>
web.xml
<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>DEBUG</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
如果你是maven项目,web.xml引用web-app_2_3.dtd规范时,是不支持<dispatcher></dispatcher>标签的,2.5版本以上才能支持。
urlrewrite.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
"http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
<urlrewrite decode-using="UTF-8">
<rule>
<from>^/rest/test/id-([0-9]+)\.html$</from>
<to>/rest/test/id/$1</to>
</rule>
<rule>
<from>^/rest/test/name-([a-z0-9A-Z]+)\.html$</from>
<to>/rest/test/name/$1</to>
</rule>
<rule>
<from>^/rest/test/age-([a-z0-9A-Z]+)\.html$</from>
<to>/rest/test/age/$1</to>
</rule>
<rule>
<from>^/rest/test/id-([0-9]+)/name-([a-z0-9A-Z]+)/index\.html$</from>
<to>/rest/test/id/$1/name/$2</to>
</rule>
</urlrewrite>
这个文件目前只能放在WEB-INF目录下。虽然UrlRewriteFilter有confPath这个参数,我把urlrewrite.xml放在根目录下,然后设置confPath参数,很遗憾不起作用。
这样就能用了,但是有些地方还是要注意一下
举个栗子
就下面这个rule来说
<rule>
<from>^/rest/test/id-([0-9]+)/name-([a-z0-9A-Z]+)/index.html$</from>
<to>/rest/test/id/$1/name/$2</to>
</rule>
from 和 to
from标签里的内容一个正则表达式,这里不普及正则的知识的。to标签对应转换后的真实URI, 1、 2分别表示from标签第一、二个括号中的内容。
uri替换
比如这个请求:http://127.0.0.1:8080/rest/test/id-123/name-wsc/index.html,会被UrlRewriteFilter过滤器拦截,并进行rule匹配,发现满足最后一个rule(^/rest/test/id-([0-9]+)/name-([a-z0-9A-Z]+)/index.html$),随后修改URI为:/rest/test/id/123/name/wsc,我写了两个Filter分别放在UrlRewriteFilter的前后,我发现如果URI被UrlRewriteFilter有效匹配,UrlRewriteFilter后面的filter将不会执行,这点很有意思。
正则注意事项
http://127.0.0.1:8080/rest/test/id-123/name-wsc/index.html,把index.html换成index1html也是成立的,别忘了“.”在正则表达式中的意义。所以,我推荐对要对“.”进行转义“.”,在正则表达式中用“\”来进行转义。
^、$开始和结束标志这两个符号也是必须要加上的,不然这条规则:/rest/test/id-([0-9]+)/name-([a-z0-9A-Z]+)/index.html,仅表示部分匹配,很容易造成规则覆盖,而且UrlRewriteFilter只匹配第一条符合的rule。
正则注意事项的最后一点,UrlRewriteFilter似乎不支持问号,无论转义与否都无法匹配,碰到这种情况,推荐使用减号“-”,或者下划线“_”代替。