1. 程式人生 > >filter(過濾器)的簡單介紹

filter(過濾器)的簡單介紹

過濾器filter的簡介

 filter 是對客戶端訪問資源的請求的過濾,當符合條件的時候放行,不符合條件的不放行,並且可以對目標資源訪問前後進行邏輯處理。

filter的工作流程大致如下所示:

 

如何編寫一個過濾器?

1.編寫一個過濾器的類實現 filter 介面。

2.實現介面中尚未實現的方法(著重實現 doFilter() 方法)

3.web.xml中進行配置(主要是配置要對哪些資源進行過濾)

filter的api詳解

filter生命週期的相關方法

Filter介面有三個方法,並且這個三個都是與Filter的生命相關的方法

 init(Filterconfig) 代表filter物件初始化方法 filter物件建立時執行

 doFilter(ServletRequest,ServletResponse,FilterCha) 代表filter執行過濾的核心方法,如果某資源在已經被配置到這個filter進行過濾的話,那麼每次訪問這個資源都會執行doFilter方法

 destory() 代表是filter銷燬方法 當filter物件銷燬時執行該方法

filter物件的生命週期

filter何時建立:伺服器啟動時就建立該filter物件

filter何時銷燬:伺服器關閉時filter銷燬

filter的api詳解

init(FilterConfig filterConfig)

其中引數 FilterConfig 代表該filter物件的配置資訊的物件,內部封裝是該filter的配置資訊。

destory()

filter物件銷燬時執行

doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)

其中的引數:

ServletRequest/ServletResponse:每次在執行doFilter方法時,web容器負責建立一個request和一個response物件作為doFilter的引數傳遞進來。該request和該response就是在訪問目標資源的service方法時的request和response。

FilterChain:過濾器鏈物件,通過該物件的doFilter方法可以放行該請求。

下面是filter的工作流程:

案例介紹

/**
 * Copyright (C), 2018, hzhiping
 * Title:FilterDemo01
 * Author:hzhiping
 * Date:2018/12/12 20:09
 * Description: filter的api方法和過濾的相關api方法介紹
 */
package com.hzhiping.filter;

import javax.servlet.*;
import java.io.IOException;

public class FilterDemo01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("過濾器初始化--------");
        // filter建立的時候執行這個方法
        // 獲取web.xml中filter的名稱
        System.out.println(filterConfig.getFilterName());
        // 獲取當前filter的初始化引數
        System.out.println(filterConfig.getInitParameter("hzhiping"));
        // 獲取ServletContext
        filterConfig.getServletContext();
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("FilterDemo01執行之前-----");
        // 讓目標資源放行
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("FilterDemo01執行之後-----");
    }

    @Override
    public void destroy() {
        System.out.println("FilterDemo01銷燬------");
    }
}

寫完filter之後,編寫配置檔案 web.xml :

執行該案例:

filter的配置介紹

此處我們以一個完整的web.xml進行介紹filter的相關配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <display-name>Archetype Created Web Application</display-name>
    <filter>
        <filter-name>filterDemo01</filter-name>
        <filter-class>com.hzhiping.filter.FilterDemo01</filter-class>
        <init-param>
            <param-name>hzhiping</param-name>
            <param-value>coder</param-value>
        </init-param>
        <init-param>
            <param-name>hzhihui</param-name>
            <param-value>student</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo01</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>ERROR</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ASYNC</dispatcher>
    </filter-mapping>
</web-app>

filter:註冊一個過濾器

  filter-name:過濾器的名稱

  filter-class:過濾器所在的類的全路徑

  init-param:初始化引數

    param-name:引數名稱

    param-value:引數值

filter-mapping:過濾器的對映

  filter-name:過濾器名稱,通過這個來對映到註冊的過濾器,然後找到註冊的過濾器的所在的類

  url-pattern:設定filter所攔截的請求路徑

    1.完全匹配:/servlet01

    2.目錄匹配:/aaa/bbb/*

            /user/*:訪問前臺的資源進入此過濾器

               /admin/*:訪問後臺的資源的時候執行此過濾器

    3.副檔名匹配:*.html,*.jsp

  dispatcher:訪問的方式(瞭解)

    REQUEST:預設值,代表直接訪問某個資源時執行filter

    FORWARD:轉發時才執行filter

    INCLUDE: 包含資源時執行filter

    ERROR:發生錯誤時 進行跳轉是執行filter

堅壁清野