Filter 過(guò)濾器

Filter過(guò)濾器 是什么

java web 中的過(guò)濾器可以攔截所有訪問(wèn)web資源的請(qǐng)求或響應(yīng)操作。

Filter過(guò)濾器 有什么用

  • 攔截
  • 數(shù)據(jù)處理
  • 統(tǒng)一控制

Filter過(guò)濾器 如何用

使用步驟

  • 創(chuàng)建一個(gè)類實(shí)現(xiàn)Filter接口
  • 重寫接口中方法 doFilter 方法是真正過(guò)濾的。
  • 在web.xml文件中配置
注意
在Filter的doFilter方法如果沒(méi)有執(zhí)行chain.doFilter(request,response)
那么資源是不會(huì)被訪問(wèn)到的。
示例
public class Myfilter2 implements Filter {

    public void destroy() {
    }
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Myfilter2 執(zhí)行了");
        //放行
        chain.doFilter(request, response);
        System.out.println("Myfilter2 攔截結(jié)束了");
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

}

  <filter>
      <filter-name>MyFilter3</filter-name>
      <filter-class>cn.leyue.filter.MyFilter3</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>MyFilter3</filter-name>
      <url-pattern>/servlet/indexServlet</url-pattern>
  </filter-mapping>

FilterChain

FilterChain是servlet 容器為開(kāi)發(fā)人員提供的對(duì)象,他提供了對(duì)某一個(gè)資源的已過(guò)濾請(qǐng)求調(diào)用鏈的視圖喂窟。
過(guò)濾器使用FilterChain調(diào)用鏈中的下一個(gè)過(guò)濾器。
如果調(diào)用的過(guò)濾器是鏈中的最后一個(gè)過(guò)濾器 則調(diào)用鏈末尾的資源。

怎樣可以形成一個(gè)Filter鏈类垦?
    只要多個(gè)Filter 對(duì)同一個(gè)資源進(jìn)行攔截可以形成Filter鏈
怎樣確定Filter的執(zhí)行順序
    由<filter-mapping>來(lái)確定
filter過(guò)濾器.png

Filter 生命周期

  • 當(dāng)服務(wù)器啟動(dòng),會(huì)創(chuàng)建Filter對(duì)象城须,并調(diào)用init方法蚤认,只調(diào)用一次
  • 當(dāng)訪問(wèn)資源時(shí),路徑與Filter的攔截路徑匹配糕伐,會(huì)執(zhí)行Filter中的doFilter方法砰琢,這個(gè)方法
    是真正攔截操作的方法。
  • 當(dāng)服務(wù)器關(guān)閉時(shí),會(huì)調(diào)用Filter的destroy 方法來(lái)進(jìn)行銷毀操作陪汽。

FilterConfig

在Filter的init 方法上有一個(gè)參數(shù)训唱,類型就是FilterConfig,
FilterConfig它是Filter的配置對(duì)象挚冤,它可以完成以下功能:
* 獲取Filter名稱
* 獲取Filter初始化參數(shù)
* 獲取ServletContext 對(duì)象
getFilterName()  getInitParameter(String name) 
getInitParameterNames() getServletContext();

* 怎樣在Filter中獲取一個(gè)FilterConfig對(duì)象况增?
    private FilterConfig fConfig;
    public void init(FilterConfig fConfig) throws ServletException {
        this.fConfig = fConfig;
    }

Filter 配置

基本配置
<filter>
    <filter-name>filter</filter-name>
    <filter-class>filter類的包名.類名</filter-class>

</filter>   
<filter-mapping>
    <filter-name>filter 名稱</filter-name>    
    <filter-pattern>路徑</filter-pattern>
</filter-mapping>   

<url-pattern>

完全匹配 以“/demo”開(kāi)始,不包含通配符
目錄匹配 以“/”開(kāi)始训挡,以*結(jié)束
擴(kuò)展名匹配 *.xxx 不能寫成 /*.xxx

<servlet-name>

<filter>
  <filter-name>MyFilter3</filter-name>
  <filter-class>cn.leyue.filter.MyFilter3</filter-class>
</filter>
   
<filter-mapping>
    <filter-name>MyFilter3</filter-name>
    <url-pattern>/servlet/indexServlet</url-pattern>
</filter-mapping>

<dispatcher>

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

可以取的值有 REQUEST FORWARD ERROR INCLUDE
它的作用是:當(dāng)以什么方式去訪問(wèn)web資源時(shí)澳骤,進(jìn)行攔截操作.
1.REQUEST 當(dāng)是從瀏覽器直接訪問(wèn)資源,或是重定向到某個(gè)資源時(shí)進(jìn)行攔截方式配置的 它也是默認(rèn)值
2.FORWARD 它描述的是請(qǐng)求轉(zhuǎn)發(fā)的攔截方式配置
3.ERROR 如果目標(biāo)資源是通過(guò)聲明式異常處理機(jī)制調(diào)用時(shí)澜薄,那么該過(guò)濾器將被調(diào)用宴凉。除此之外,過(guò)濾器不會(huì)被調(diào)用表悬。
4.INCLUDE 如果目標(biāo)資源是通過(guò)RequestDispatcher的include()方法訪問(wèn)時(shí)弥锄,那么該過(guò)濾器將被調(diào)用。除此之外蟆沫,該過(guò)濾器不會(huì)被調(diào)用

md5 加密

public static String md5(String plainText) {
    byte[] secretBytes = null;
    try {
        secretBytes = MessageDigest.getInstance("md5").digest(
                plainText.getBytes());
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("沒(méi)有md5這個(gè)算法籽暇!");
    }
    String md5code = new BigInteger(1, secretBytes).toString(16);
    for (int i = 0; i < 32 - md5code.length(); i++) {
        md5code = "0" + md5code;
    }
    return md5code;
}

全局的編碼過(guò)濾器

public class EncodingFilter implements Filter {

/**
 * Default constructor.
 */
public EncodingFilter() {
    // TODO Auto-generated constructor stub
}

/**
 * @see Filter#destroy()
 */
public void destroy() {
    // TODO Auto-generated method stub
}

/**
 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
 */
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    req.setCharacterEncoding("utf-8");
    
    
    MyRequest myRequst = new MyRequest(req);

    chain.doFilter(myRequst, response);
}

/**
 * @see Filter#init(FilterConfig)
 */
public void init(FilterConfig fConfig) throws ServletException {
    // TODO Auto-generated method stub
}

/**
 * 實(shí)現(xiàn)與被包裝對(duì)象相同的接口
 *  定義一個(gè)與包裝類相同對(duì)象的引用 
 *  定義一個(gè)構(gòu)造方法,把被包裝對(duì)象傳過(guò)來(lái) 
 *  對(duì)于不需要改寫方法饭庞,直接調(diào)用
 * 對(duì)于無(wú)需要改寫方法戒悠,寫自己的方法體
 */
class MyRequest extends HttpServletRequestWrapper {
    HttpServletRequest request;

    public MyRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    @Override
    public String getParameter(String name) {
        if(getParameterMap().get(name)==null) {
            return null;
        }
        return getParameterMap().get(name)[0];
    }

    @Override
    public String[] getParameterValues(String name) {
        return getParameterMap().get(name);
    }

    private boolean flag = true;

    @Override
    public Map<String, String[]> getParameterMap() {
        //獲取請(qǐng)求方式
        String method = request.getMethod();
        if(method.equalsIgnoreCase("post")) {
            //處理亂碼
            try {
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            
        } else if(method.equalsIgnoreCase("get")) {
            Map<String, String[]> map = this.request.getParameterMap();
            if (!flag) {
                for (Map.Entry<String, String[]> m : map.entrySet()) {
                    String[] values = m.getValue();
                    for (int i = 0; i < values.length; i++) {
                        try {
                            //get方式處理亂碼
                            values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                    }
                }
                flag =true;
            }
            return map;
            
        }
        return super.getParameterMap();
        
    }
}

}


2016.11.6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舟山,隨后出現(xiàn)的幾起案子绸狐,更是在濱河造成了極大的恐慌,老刑警劉巖累盗,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寒矿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡若债,警方通過(guò)查閱死者的電腦和手機(jī)符相,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蠢琳,“玉大人啊终,你說(shuō)我怎么就攤上這事“列耄” “怎么了蓝牲?”我有些...
    開(kāi)封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泰讽。 經(jīng)常有香客問(wèn)我例衍,道長(zhǎng)昔期,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任肄渗,我火速辦了婚禮镇眷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翎嫡。我一直安慰自己欠动,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布惑申。 她就那樣靜靜地躺著具伍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圈驼。 梳的紋絲不亂的頭發(fā)上人芽,一...
    開(kāi)封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音绩脆,去河邊找鬼萤厅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛靴迫,可吹牛的內(nèi)容都是我干的惕味。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼玉锌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼名挥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起主守,我...
    開(kāi)封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤禀倔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后参淫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體救湖,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年黄刚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捎谨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憔维,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畏邢,到底是詐尸還是另有隱情业扒,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布舒萎,位于F島的核電站程储,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜章鲤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一摊灭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧败徊,春花似錦帚呼、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至沪哺,卻和暖如春沈自,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辜妓。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工枯途, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人籍滴。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓酪夷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親异逐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捶索,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 創(chuàng)建 編寫一個(gè)過(guò)濾器的類,實(shí)現(xiàn)Filter接口 實(shí)現(xiàn)接口尚未實(shí)現(xiàn)的方法灰瞻,著重實(shí)現(xiàn)doFilter方法 在web.x...
    蕊er閱讀 439評(píng)論 0 0
  • Filter可以視作是servlet的加強(qiáng)版腥例,主要用作對(duì)用戶的請(qǐng)求進(jìn)行預(yù)處理,或者對(duì)返回給客戶端的結(jié)果進(jìn)行再次加工...
    Single_YAM閱讀 2,686評(píng)論 1 7
  • 本文包括:1酝润、Filter簡(jiǎn)介2燎竖、Filter是如何實(shí)現(xiàn)攔截的?3要销、Filter開(kāi)發(fā)入門4构回、Filter的生命周期...
    廖少少閱讀 7,272評(píng)論 3 56
  • Filter的使用和經(jīng)典案例 一、什么是Filter Filter也稱之為過(guò)濾器疏咐。 通過(guò)Filter可以攔截所有對(duì)...
    明天你好向前奔跑閱讀 1,163評(píng)論 0 5
  • Filter簡(jiǎn)介 Filter也稱之為過(guò)濾器纤掸,它是Servlet技術(shù)中最實(shí)用的技術(shù),Web開(kāi)發(fā)人員通過(guò)Filter...
    java部落閱讀 287評(píng)論 0 1