標籤: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起作用。