伪静态—urlRewrite

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似乎不支持问号,无论转义与否都无法匹配,碰到这种情况,推荐使用减号“-”,或者下划线“_”代替。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值