天天看點

URLreWrite在sturts2中碰到的問題

  最近公司要開發新的項目要用到URL重寫,本人技術水準有限,就了解了兩個工具,ApaChe's的mod_rewrite和Urlrewrite。公司的大蝦讓選擇用後者Urlrewrite,蝦米跟之 — — 。

  老規矩,學新技術先去官網http://tuckey.org/urlrewrite/ ,咬文檔(本人比較笨,見笑 — — ),目前最新版本是 4.0.3,下載下傳jar包 urlrewritefilter-4.0.3.jar  或者在Maven POM裡配置下面代碼

<dependency>
    <groupId>org.tuckey</groupId>
    <artifactId>urlrewritefilter</artifactId>
    <version>4.0.3</version>
</dependency>      

 本人使用的是後者。重新建構下項目,然後在項目的/web-inf/web.xml中添加上下面代碼

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    <!-- urlrewrite.xml	檔案存放路徑 default /WEB-INF/urlrewrite.xml -->
          <init-param>
	 	 <param-name>confPath</param-name>
		 <param-value>/WEB-INF/urlrewrite.xml</param-value>
          </init-param>

</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>      

  urlrewrite.xml 隻能放到WEB-INF下面。

  繼續 urlrewrite.xml 配置文檔代碼

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
        "http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<rule>
 <note>大小寫字母數字都可  </note>
<from >/uee/([_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+).html$</from>
    <to type="forward">/uee/$1.do</to>
</rule>
<outbound-rule>
        <note> 	</note>
         <from>^/page/second.do\?me=([a-z]+)$</from>
       
	 <to >/page/me_$1</to>  
</outbound-rule>

</urlrewrite>      

  rule是url規則,from是顯示出來的位址,to是映射的實際位址,$1是重寫參數,可以為多個,()裡是比對的正規表達式. 

  <outbound-rule> 是隐藏 a 連結的,就如官網上說的 Note, If you are using JSTL (ie, <c:url) this will work also. 意思就是說需要轉化的連結不能直接寫在a标簽中需要寫在c:url或其他伺服器需要解析的變量中這樣才能對其重新顯示。 在頁面上插入下面代碼

<a href="<%=response.encodeURL(" target="_blank" rel="external nofollow" /page/second.do?me=aa") %>">/page/second.jsp?me=aa</a>
           

 然後滑鼠放到該a連結上 你會發現通路路徑已經變成了 http://localhost:8080/page/me_aa 真實的路徑已經被隐藏。

  常用正規表達式:

   ^[A-Za-z]+$ //比對由26個英文字母組成的字元串 大小寫都可

   ^[A-Z]+$ //比對由26個英文字母的大寫組成的字元串

   ^[a-z]+$ //比對由26個英文字母的小寫組成的字元串

   ^[A-Za-z0-9]+$ //比對由數字和26個英文字母組成的字元串

   ^/w+$ //比對由數字、26個英文字母或者下劃線組成的字元串

  正規表達式這塊要細心點,本人對這塊沒多少研究的,僅限與會用,知道大概意思。

  好了,其餘的東東,都不細說了,配置完畢後理想狀态是可以運作了,是的,可以運作了,但是目前隻是簡單的一些頁面的URL位址實作了重寫,如果是Action的話就不行了,這時在/WEB-INF/web.xml中Struts2的filter-mapping 加入下面代碼中<dispatcher>即可。

<filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.do</url-pattern>
        <dispatcher>REQUEST</dispatcher>   
       	<dispatcher>FORWARD</dispatcher>   
       	<dispatcher>INCLUDE</dispatcher>   
    </filter-mapping>      

繼續閱讀