概念
1鹏控、JavaWeb 的一個重要組件蚕泽,可以對發(fā)送到 Servlet 的請求進行攔截冤寿,并對響應也進行攔截
2哼鬓、Filter 是實現(xiàn)了 Filter 接口的 Java 類
3毅该、Filter 需要在 web.xml 文件中進行配置和映射
使用
1博秫、創(chuàng)建一個實現(xiàn)類,并實現(xiàn)于?Filter 接口
2鹃骂、在 web.xml 文件中配置并映射該?Filter
注:其中 <url-pattern> 指定該 Filter 準備攔截哪些資源台盯,或者從哪些 url 可以訪問該 Filter?
運行后,控制臺第一次打印 init 方法畏线,后面每次刷新都調(diào)用 doFilter 方法
Filter 相關 API?
1静盅、Filter 接口
⑴?public void init(FilterConfig filterConfig)?
該方法類似于 Servlet 的 init 方法,被創(chuàng)建時調(diào)用寝殴,且只被調(diào)用一次蒿叠,該方法用于對當前的 Filter 進行初始化操作,F(xiàn)ilter 實例是單例的蚣常,其中參數(shù)?filterConfig 類似于 Servlet 的 ServletConfig 可以在 web.xml 文件中配置當前 Filter 的初始化參數(shù)
⑵?public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)
真正的 Filter 的邏輯代碼都寫在該方法中市咽,每次攔截都會調(diào)用該方法。filterChain:Filter 鏈抵蚊,多個 Filter 可以構(gòu)成一個 Filter 鏈施绎。
doFilter(ServletRequest servletRequest,ServletResponse servletResponse):把請求傳給 Filter 鏈的下一個 Filter溯革,若當前 Filter 是 Filter 鏈的最后一個 Filter,則把請求傳給目標 Servlet(或 JSP)
注:多個 Filter 攔截的順序和?<filter-mapping> 配置的順序有關谷醉,靠前的先被調(diào)用
⑶ public void destroy()?
釋放當前 Filter 所占用的資源致稀,在 Filter 被銷毀之前被調(diào)用且只被調(diào)用一次
2、Filter 代碼執(zhí)行順序
Dispatcher?
指定過濾器所攔截的資源被 Servlet 容器調(diào)用的方式俱尼, 可以是 REQUEST抖单,INCLUDE,F(xiàn)ORWARD 和 ERROR 之一遇八,默認為 REQUEST矛绘,同時可以設置多個 <dispatcher> 子元素用來指定 Filter 對資源的多種調(diào)用方式進行攔截
REQUEST:當用戶之間訪問頁面時,web 容器將會調(diào)用過濾器刃永,如果目標資源是通過 RequestDespatcher 的 include() 或 forward() 方法訪問時货矮,那么該過濾器就不會被調(diào)用。
INCLUDE:如果目標資源是通過?RequestDespatcher? 的 include() 方法訪問時斯够,那么該過濾器將被調(diào)用次屠,除此之外,該過濾器不會被調(diào)用雳刺。
FORWARD:如果目標資源是通過?RequestDespatcher 的 forward() 方法訪問時劫灶,那么該過濾器將被調(diào)用,除此之外掖桦,該過濾器不會被調(diào)用本昏。
ERROR:如果目標資源時通過聲明式異常處理機制調(diào)用時,那么該過濾器將被調(diào)用枪汪。除此之外涌穆,過濾器不會被調(diào)用
配置方法如下:
使瀏覽器不緩存頁面的過濾器
在 doFilter 里面同時設置三種響應頭:
1、response.setDataHeader("Expires",-1)
2雀久、response.setHeader("Cache-Control","no-cache")
3宿稀、response.setHeader("Pragma","no-cache")
字符編碼過濾器
當頁面?zhèn)髦党霈F(xiàn)中文亂碼時,可以通過對過濾器設置編碼來解決
以上為本人的一些學習筆記赖捌,如有出錯歡迎指正祝沸,陸續(xù)更新!T奖印罩锐!