Java 之Filter 應用實例--強大的UrlRewriteFilter


一、背景

公司的門戶資訊網站的需求:對所有的靜態頁面做301 重定向(seo 提出的),例如:輸入abc.com 能夠重定向到 www.abc.com,輸入abc.com/news 能夠重定向到www.abc.com/news。

二、301 重定向簡介

1. 首先要明白什么是重定向?

提到重定向我第一時間想到的是轉發,因為這兩者經常被拿到一起來做比較,也是我們在面試過程中經常被提到的一個問題。那么什么是重定向和轉發?他們的區別又是什么?

簡單來說,他們都是servlet 的兩種請求方式

轉發:直接轉發方式(Forward),客戶端和瀏覽器只發出一次請求,Servlet、HTML、JSP或其它信息資源,由第二個信息資源響應該請求,在請求對象request中,保存的對象對於每個信息資源是共享的。

重定向:間接轉發方式(Redirect)實際是兩次HTTP請求,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。

他們的區別:

Forward 和Redirect 代表了兩種請求轉發方式:直接轉發和間接轉發。對應到代碼里,分別是RequestDispatcher 類的forward() 方法和HttpServletRequest 類的sendRedirect() 方法。

對於直接方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給Servlet、HTML、JSP 或其它信息資源,由第2個信息資源響應該請求,兩個信息資源共享同一個request 對象。

對於間接方式,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL 發出請求,從而達到轉發的目的。它本質上是兩次HTTP 請求,對應兩個request 對象。

(詳細介紹可以查看JAVA常見面試題之Forward和Redirect的區別

2. 301 重定向即頁面永久性移走(301重定向)是一種非常重要的“自動轉向”技術。網址重定向最為可行的一種辦法。當用戶或搜索引擎向網站服務器發出瀏覽請求時,服務器返回的HTTP數據流中頭信息(header)中的狀態碼的一種,表示本網頁永久性轉移到另一個地址。還有一個是302 重定向,也叫暫時性轉移(Temporarily Moved ),這里就不展開講述。

三、301 重定向使用場景

1. 網站更換域名時,通過301永久重定向將舊域名重定向至新域名,挽回流量損失和SEO。

2. 當出於需要刪除網站中的某些目錄時,比如我要刪除我博客下的博客導航,這時就可以用301永久重定向到網站首頁。

3. 如果你有多個閑置域名時需要指向同一網站時,通過301永久重定向可以實現。

4. 你打算實現網址規范化(就是我們現在的需求)。

四、301 重定向的實現

1. 通過java通過Filter過濾器實現html靜態文件301重定向,該方法需要自己寫邏輯判斷,拼接出需要重定向的url 值,再做301 重定向。

2. 偽靜態urlrewrite,即使用Url Rewrite 進行URL 重寫來實現網站的偽靜態。

這里我們詳細解釋一下方法2,偽靜態urlrewrite,它主要用到的是一個urlRewriteFilter 用於改寫URL的Web過濾器。類似於Apache的mod_rewrite。適用於任何Web應用服務器(如Tomcat,jboss,jetty,Resin,Orion等)。其典型應用就把動態URL靜態化,便於搜索引擎爬蟲抓取你的動態網頁。

第一步:下載urlrewrite jar 包,放到web-info的lib目錄中,我這里直接利用mavan 進行管理,在pom.xml 文件中添加

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

第二步:編輯WEB-INF/web.xml 在其它servlet mapping前加入

<!-- html 301 請求監聽 -->
     <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>

第三步:配置urlrewrite.xml 文件,添加跳轉規則

<urlrewrite>
     <rule>
           <name>seo redirect 301</name>
           <condition name="host" operator="equal">^abc.com$</condition>
           <from>^/(.*)</from>
           <to type="permanent-redirect" last="true">http://www.abc.com/$1</to>;
     </rule>
</urlrewrite> 
標簽說明:rule:url 重寫規則,匹配規則有兩種:regex (默認)和 wildcard
                  name: 規則名稱
                  conditions:所有的conditions在rule攔截時都會執行(除非next設置為or)
                  from:攔截請求的url 
                  to:需求重定向的url

詳細的標簽說明可以查閱官網文檔 http://tuckey.org/urlrewrite/manual/3.0/index.html#install

(另外說一下,項目之前有要求說增加多域名訪問,最開始的做法是在 server.xml 文件中多增加一個<Alias>abc.com</Alias>。但是做了301 重定向的實現 之后發現這個可以去掉。)

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM