Filter技術+職責鏈模式

來源:互聯網
上載者:User

標籤:style   blog   http   java   檔案   2014   html   ar   

     Filter是一個過濾器,存在Web用戶端與請求的資源之間,這裡的資源可以說是jsp或servlet。它的作用就是在請求達到資源之前,先對請求進行預先處理,並且也可以對servlet處理後的response進行修改。

   Filter可以是有很多個,當一個個Filter組合成起來,就形成了一個FilterChain。也就是我們說的過濾鏈,這個過濾鏈處理的過程,就是我們前面學的職責鏈模式的一個體現。 

   下面是一個修改字串的小例子:  

 

1.FilterChain內包含各個子filter,利用dofilter()進行傳遞請求和響應

public class FilterChain implements Filter {List<Filter> filters = new ArrayList<Filter>();  //定義一個存放filter的集合int index = 0; public FilterChain addFilter(Filter f){this.filters.add(f);    //添加Filtereturn this;}@Overridepublic void doFilter(Request request, Response response,FilterChain chain) {//迴圈遍曆每一個Filterif(index == filters.size()) return;Filter f = filters.get(index);index ++;//並且利用doFilter()方法接收request和responsef.doFilter(request, response, chain);}}


2.HTMLFilter:修改字串的標籤,請求過來之後,調用chain.dofilter()方法,繼續傳遞請求。


package com.bjsrt.dp.filter;public class HTMLFilter implements Filter {@Overridepublic void doFilter(Request request, Response response,FilterChain chain) {System.out.println("FilterChain調用dofilter(),擷取HTMLFilter的請求命令!");request.requestStr = request.requestStr.replace('<', '[').replace('>', ']')+"----HTMLFilter()";chain.doFilter(request, response, chain);response.responseStr += "----HTMLFilter()";System.out.println("擷取HTMLFilter的請求響應!");}}

3.SesitiveFilter:處理敏感詞,請求過來之後,調用chain.dofilter()方法,發現沒有下一個請求了,進行響應。

package com.bjsrt.dp.filter;public class SesitiveFilter implements Filter {@Overridepublic void doFilter(Request request, Response response,FilterChain chain) {System.out.println("調用SesitiveFilter的dofilter方法,擷取請求命令!!");request.requestStr = request.requestStr.replace("被就業", "就業") .replace("敏感,","")+"-----SesitiveFilter()";chain.doFilter(request, response, chain);response.responseStr +="--SesitiveFilter()";System.out.println("擷取SesitiveFilter的請求響應!");}}

4.用戶端方法:設定處理filter鏈的執行順序

package com.bjsrt.dp.filter;public class Main {public static void main(String[] args) {String msg = "大家好:),<script>,敏感,被就業,網路授課沒感覺,因為看不見大傢伙兒";   //這是一個訊息(request)Request request = new Request();request.setRequestStr(msg);Response response = new Response();response.setResponseStr("response");FilterChain fc = new FilterChain();//佈建要求處理的順序fc.addFilter(new HTMLFilter())  .addFilter(new SesitiveFilter());fc.doFilter(request, response,fc);//列印出請求和響應System.out.println(request.getRequestStr());System.out.println(response.getResponseStr());}}

效果顯示:


    從效果顯示的結果來看,FilterChain的執行順序遵循先進後出的原則:當Web用戶端發送一個request的時候,這個request先是會經過FilterChain,由它利用dofilter()方法調用各個子filter,至於子filter的執行順序如何,則看用戶端是如何制定規則的。request被第一個處理之後,又通過dofilte()往下傳送,被第二個、第三個...filter截獲處理。當request被所求的資源處理之後,返回的順序是從最後一個開始進行返回,直到返回到用戶端。

   

    filterChain的處理很好的體現了職責鏈模式。事實上 filterChain的在java中已經封裝好了,並不需要我們去實現,我們只需要調用其dofilter()的方法,進行傳遞request和response。而filter的執行順序是放在xml設定檔進行配置。

   總結:Filter技術是對請求到jsp或servlet的request和response進行攔截,可以進行一系列的處理,處理之後又傳遞給下一個。filter技術也是將重複性的服務抽出來,放在設定檔中。到時候我們修改的時候,只需要到設定檔中修改,就能對所有的jsp和servlet起作用。  



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.