伪静态—urlRewrite

来源:互联网 发布:网络教育学籍注册冲突 编辑:程序博客网 时间:2024/05/21 19:50

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

0 0