java中urlrewrite的配置和使用

轉載於:http://www.cnblogs.com/czykeith/archive/2012/07/26/2609459.html


這幾天因爲要做網站中的博客功能,需要對博客的地址進行處理,用到了urlrewrite,逸風在此也給大家簡單介紹一下

urlrewrite顧名思義,就是對URL進行重寫,用戶得到的全部都是經過處理後的URL地址,這樣做我覺得好處有三:
一:提高安全性,可以有效的避免一些參數名、ID等完全暴露在用戶面前,如果用戶隨便亂輸的話,不符合規則的話直接會返回個404或錯誤頁面,這比直接返回500或一大堆服務器錯誤信息要好的多
二:美化URL,去除了那些比如*.do之類的後綴名、長長的參數串等,可以自己組織精簡更能反映訪問模塊內容的URL
三:更有利於搜索引擎的收入,通過對URL的一些優化,可以使搜索引擎更好的識別與收錄網站的信息

首先我們在web.xml中加入如下配置
<!-- url地址重寫 -->
    <filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/blog/*</url-pattern>
    <!--
    可以省略
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>

    -->
    </filter-mapping>
    
    這裏我是要做用戶博客的功能,用戶博客的地址格式爲:http://www.xxx.com/blog/+用戶自定義的個性地址,而我實際要做的是通過用戶的個性地址來查詢用戶博客的相關信息後轉到用戶的博客主頁,實際要調用的地址爲http://www.xxx.com/cblog.do?action=forwardIndex&hostUrl=用戶自定義的地址,爲了給用戶好的體驗所有我們需要用到urlrewrite來對地址欄的:http://www.xxx.com/blog/+用戶自定義的個性地址 進行轉換,已達到請求真實地址的目的。
下 面我們需要在WEB-INF下建立一個xml文件來配置urlrewrite的規則,建立的xml的文件名建議爲:urlrewrite.xml,全部小 寫,因爲urlrewrite.xml實現時就全部是小寫,如果定義的是別的名字的話,需要在web.xml中進行加載,不然不會自動加載
我定義的xml的文件的內容如下
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
"http://tuckey.org/res/dtds/urlrewrite2.6.dtd">
<urlrewrite>
    <rule>
    <from>^/blog/(\w+)</from>
        <to type="forward">/cblog.do?action=forwardIndex&amp;hostUrl=$1</to>
    </rule>
</urlrewrite>


啓動項目,如果我在地址欄輸入http://localhost:8080/test/blog/czykeith
那麼我實際請求的地址是:http://localhost:880/test/cblog.do?action=forwardIndex&hosturl=czykeith

rule結點中form的規則默認使用的是正則表達式來匹配的,當用戶訪問服務器時的URL會與該配置相比較,如果符合規則就會按照下面to結點中的配置對其進行跳轉,其默認是forward跳轉,還可以是type=redirect ,當然這兩者是有區別的

forward: 默認. 請求匹配這個<rule />的所有<condition />,並且URL使用內部跳轉到”to”指定的地址(注意, 這裏forward 到的URL 必須和UrlRewriteFilter 位於同一個容器中)。狀態碼302。臨時重定向。

redirect :用Response.Redirect實現,請求匹配所有<condition/>和這個<rule />的<from />, 通知客戶端跳轉到<to/>指定地址,狀態碼應該是302。

permanent-redirect: 永久重定向。狀態碼301。相當於做了以下事情

      response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);.

      response.setHeader(“Location”, [<to />指定的值]);

 

passthrough: 和forward 相同,具體區別我也不清楚。

 

temporary-redirect:臨時重定向。狀態碼302。 相當於做了以下事情
response.setStatus(HttpServletResponse. SC_MOVED_TEMPORARILY);
response.setHeader(“Location”, [<to />指定的值]);

 

使用urlrewrite時需要注意
1.如果要用&符號,需要用&amp;代替
2.簡單起見, 給<from />的配置前面和後面分別加上^, $, 這兩個是正則表達式中的強制開始和結尾標誌;

3. 如果使用<outbound-rule>要記得代碼中的url都是編碼過的;

4. contex 是非常重要的, 如果有一個應用的context 是”/myapp”,並且你的請求是”/myapp/somefolder/somepage.jsp”, 容器交給UrlRewriteFilter 的url會是”/somefolder/somepage.jsp”, 這可能難以理解,但是在你的<rule>和<condition>中不要包含context path, 它是容器負責處理的.

5. 正則表達式非常複雜靈活, 請閱讀java.util.regex.Pattern中的java正則介紹。如果覺得正則難以理解,可以使用通配符方式。

6. 應用通配符,通配符匹配引擎可以替代正則表達式, 在<condition>和<rule>中設置match-type是wildcard用以開啓支持通配符.(或者設置default-match-type)
例如:
/big/url/*匹配/big/url/abc.html但是不匹配/big/url/abc/dir/或/big/url/abc/
/big/url/**匹配/big/url/abc.html,/big/url/abc/dir/和/big/url/abc/
也可以和正則的替換一樣, 每個*代表一個參數,在<set>和<to>中用$N的方式使用

7. <to />可以是null, 意義爲: 如果匹配請求不再繼續, 相當於沒有調用chain.doFilter



補 充:大家可能看到我上面的配置中有個$1 ,還不明白是什麼意思,我說明一下,$1爲<from>^/blog/(\w+)</from>中(\w+)所匹配的內容,如果 有多個根據順序$2...$6獲取就可以了,需要注意的是在from中需要用()把要匹配的內容括起來才能獲取,不然java會拋出異常


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