僞靜態—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似乎不支持問號,無論轉義與否都無法匹配,碰到這種情況,推薦使用減號“-”,或者下劃線“_”代替。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章