JavaWeb之过滤器(Filter)
一、過濾器簡介:
過濾器(Filter)是JavaWeb中最常用到的技術(shù),常用于URL的權(quán)限訪問控制,編碼轉(zhuǎn)換,錯誤頁面跳轉(zhuǎn),攔截過濾圖片,html文件,指定文字等功能。
二、過濾器如何工作:
大致過程:在客戶端發(fā)送一個請求時,即HttpServletRequest或HttpServletResponse到達(dá)Servlet之前,Filter會將其攔截下來,并對其進(jìn)行數(shù)據(jù)檢查和相應(yīng)的過濾后,再進(jìn)行放行或相應(yīng)的跳轉(zhuǎn),然后再生成響應(yīng)返回時,Filter再次對服務(wù)器的響應(yīng)進(jìn)行最后處理并到達(dá)視圖層,總的來講: 請求 ——> 過濾 ——> 響應(yīng) ——> 過濾 ——> 顯示。?在一個web應(yīng)用中,可以開發(fā)編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。web服務(wù)器根據(jù)Filter在web.xml文件中的注冊順序,決定先調(diào)用哪個Filter,如果使用的是注解方式來注冊,那么執(zhí)行順序應(yīng)該是過濾器的文件名的首字母的順序。當(dāng)?shù)谝粋€Filter的doFilter方法被調(diào)用時,web服務(wù)器會創(chuàng)建一個代表Filter鏈的FilterChain對象傳遞給該方法。在doFilter方法中,開發(fā)人員如果調(diào)用了FilterChain對象的doFilter方法,則web服務(wù)器會檢查FilterChain對象中是否還有filter,如果有,則調(diào)用第2個filter,如果沒有,則調(diào)用目標(biāo)資源。
生命周期:Filter接口實(shí)現(xiàn)類中要實(shí)現(xiàn)三個方法:init方法,doFilter方法,destroy方法。
(1) init(FilterConfig):
初始化接口,在web服務(wù)器啟動時Filter初始化被調(diào)用,它與Servlet的init方法的作用是一樣的,FilterConfig能得到容器的初始化參數(shù)及相應(yīng)的一些數(shù)據(jù)。
1 String getFilterName();//得到filter的名稱。 2 String getInitParameter(String name);//返回在部署描述中指定名稱的初始化參數(shù)的值。如果不存在返回null. 3 Enumeration getInitParameterNames();//返回過濾器的所有初始化參數(shù)的名字的枚舉集合。 4 public ServletContext getServletContext();//返回Servlet上下文對象的引用。(2) doFilter(ServletRequest, ServletResponse, FilterChain):
每個用戶的請求進(jìn)來時這個方法都會被調(diào)用,這個方法會在Servlet的service方法之前被調(diào)用,是過濾器的主體。FilterChain代表當(dāng)前的整個請求鏈,通過調(diào)用FilterChain.doFilter可以將請求繼續(xù)傳遞下去,如何攔截這個請求,只需不調(diào)用該方法,那么這個請求就直接返回。所以Filter是一種責(zé)任鏈設(shè)計模式。doFilter可以做到:調(diào)用目標(biāo)資源之前,讓一段代碼執(zhí)行。 是否調(diào)用目標(biāo)資源(即是否讓用戶訪問web資源)。web服務(wù)器在調(diào)用doFilter方法時,會傳遞一個filterChain對象進(jìn)來,filterChain對象是filter接口中最重要的一個對象,它也提供了一個doFilter方法,開發(fā)人員可以根據(jù)需求決定是否調(diào)用此方法,調(diào)用該方法,則web服務(wù)器就會調(diào)用web資源的service方法,即web資源就會被訪問,否則web資源不會被訪問。
(3) destroy
Filter對象創(chuàng)建后會駐留在內(nèi)存,當(dāng)web應(yīng)用移除或服務(wù)器停止時才銷毀,當(dāng)Filter對象被銷毀時,這個方法被調(diào)用。值得注意的時,根據(jù)上面所提到的響應(yīng)時還會進(jìn)行一次過濾,所以當(dāng)Web容器調(diào)用這個方法之后,容器還會再調(diào)用一次doFilter方法。
三、簡單實(shí)例:
在這里我們用的是Servlet3.0新增的注解方式來代替以前使用的xml配置:
?
?
?
一些知識來源:https://www.cnblogs.com/coderland/p/5902878.html
轉(zhuǎn)載于:https://www.cnblogs.com/chenloveslife/p/8946260.html
總結(jié)
以上是生活随笔為你收集整理的JavaWeb之过滤器(Filter)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3.5+selenium操作
- 下一篇: Actuator 端点监控