urlrewriter轉載

如今大部分的網站和商城都會使用到URL重寫,接觸到這個,也是由於正在作的電子商務商城。URL重寫,是將原有的URL採用另外一種規則來顯示,使得用戶方便訪問同時也屏蔽一些信息。html

  在此說下它的好處,在開發過程當中,常常會遇到一些帶了一大堆參數的URL,這樣子,一方面顯得煩亂,另外一方面,一些信息直接顯示在URL上,會有些安全性問題。使用URL重寫,可使帶有參數的URL以一種較規則的方式體現,如:web

  /demoAction?id=1            ==>            /demo1.html正則表達式

  它也將本該在URL上顯示出來的傳參給隱蔽起來,隱藏了技術實現和敏感信息。另外,URL重寫,也有利於搜索引擎的訪問。安全

  最近項目接觸到的URL重寫採用的是UrlRewrite,它主要是採用Filter技術在用戶請求的時候對訪問的URL進行處理,來實現重寫的做用。app

  如下是UrlRewrite的使用實例(我的認爲,UrlRewrite的官方文檔寫的仍是比較全面易懂的)框架

  UrlRewrite的導入:函數

  UrlRewrite的導入很是簡單,首先需在項目的lib文件夾中加入urlrewrite-3.2.0.jar包,而後,在web.xml中聲明Filter性能

1網站

2搜索引擎

3

4

5

6

7

8

9

10

<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>/*</url-pattern>

        <dispatcher>REQUEST</dispatcher>

        <dispatcher>FORWARD</dispatcher>

    </filter-mapping>

  聲明完filter後,須要在WEB-INF目錄下新建一個urlrewrite.xml文件

1

2

3

4

5

6

7

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE urlrewrite

PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"

"http://tuckey.org/res/dtds/urlrewrite3.0.dtd">

<urlrewrite>   

     

</urlrewrite>

  該文件是UrlRewrite的規則制定文件,後續主要經過配置它來進行URL的重寫。

  至此,UrlRewrite的導入就完成了

  UrlRewrite 導入成功後,接下來主要經過在urlrewrite.xml添加規則,就能實現URL的重寫了。在此列舉一些經常使用的規則。

1

2

3

4

<rule>

       <from>^/demo/(\w+).html$</from>

       <to type="redirect">/Struts/$1</to>

</rule>

  rule 是urlrewrite下的子節點,是urlrewrite的主要規則節點,在它裏面包含from 和to兩個子節點,from表示請求的URL,to表示將轉到的真實的URL。關於from,UrlRewrite有兩種匹配的模式,一種是正則表達式匹 配,一種的通配符匹配,如上就是正則表達式匹配。當進行匹配的時候,匹配部分的正則能夠被提取爲參數進行傳遞

  如上規則設置,當客戶端訪問的網址是http://127.0.0.1:8080/Struts/demo/hello.html  的時候,由於匹配部分是hello,因此它跳轉到的是http://127.0.0.1:8080/Struts/hello 上。當網址規則中有多個正則的時候,匹配的參數也會隨之增長。如:

1

2

3

4

<rule>

        <from>^/demo1/(\w+)/(\w+).html$</from>

        <to type="redirect" >/Struts/$1.action?age=$2</to>

</rule>

  rule 的默認匹配方式是正則表達式,可是,有時候也能夠以通配符的形式進行匹配。在編寫規則的時候,只須要在rule添加一個match-type="wildcard" 的屬性便可。

1

2

3

4

<rule match-type="wildcard">

        <from>/demo2/*/*</from>

        <to type="redirect">/Struts/$1.action?age=$2</to>

</rule>

  關於to節點,UrlRewrite提供了多種網址跳轉方式,如forward和redirect,這兩種方式,和大部分MVC框架提供的功能同樣,在此再也不贅述。

  除了支持指定規則的跳轉外,UrlRewrite還支持當匹配規則的時候執行某個對象的某個函數

1

2

3

4

5

<rule>

        <from>^/demo3/(\w+)/(\w+).html$</from>

        <run class="com.sean.action.Demo" method="log" />

        <to type="redirect" >/Struts/$1.action?age=$2</to>

</rule>

  如上述設置,要實現匹配規則是執行某個函數,須要添加多一個run節點,在節點上面添加對應的類屬性和方法屬性。同時,對應的類必須繼承 RewriteRule類,執行的方法必須傳入兩個參數,分別是HttpServletRequest 和HttpServletResponse

1

2

3

4

5

6

7

8

9

10

public class Demo extends RewriteRule{

 

    public void log(HttpServletRequest request,HttpServletResponse response){

        System.out.println("haha1");

    }

     

    public void log2(HttpServletRequest request,HttpServletResponse response){

        System.out.println("haha2");

    }

}

  這樣,當客戶端輸入的網址第一次匹配到指定規則的時候,UrlRewrite就會執行對應的函數,該函數只在第一次匹配成功的時候執行。

  若是想要每次匹配規則都執行某函數,能夠在urlrewrite添加class-rule子節點,該節點設置後,每次匹配規則後,指定的函數都會執行一次。

1

<class-rule class="com.sean.action.Demo" method="log2"/>

  除了對請求的URL進行處理外,UrlRewrite還提供了對返回頁面中的地址進行重寫的功能。使用rule是對用戶輸入的url進行處理,可是開發過程當中,常常須要在頁面中也添加一些網址請求,UrlRewrite能夠經過規則,對頁面中的網址也進行重寫。如:

1

2

3

4

<outbound-rule match-type="regex">

        <from>/(\w+).action\?id=(\w+)$</from>

        <to>/$1.html</to>

</outbound-rule>

  在UrlRewrite中添加該規則後,咱們在頁面中本來的地址是

  但是在頁面中顯示卻成了以下:

  這樣能夠隱藏了許多開發中的技術,較爲安全。

  以上,就是UrlRewrite的一些常見的用法。關於UrlRewrite,網上也有人說這個會影響性能,由於在每次請求的時候都須要通過換一次過濾,可是這個仍是要見仁見智,畢竟,使用URL重寫,對網址仍是有好處的。

  UrlRewrite的幫助文檔:http://pan.baidu.com/s/1c0fg0uc

相關文章
相關標籤/搜索