過濾器的作用不論是在前端和后端都存在非常重要的作用妇汗,但是其實(shí)現(xiàn)還是非常簡單的厦酬。原理圖:
[圖片上傳失敗...(image-9de27e-1551666962606)]
在開發(fā)中過濾器有有一個(gè)什么樣的角色糊渊?
在實(shí)際開發(fā)與前端對接時(shí),前端開發(fā)者傳輸過來的數(shù)據(jù)一般是UTF-8格式的,而JSP中卻不是這種默認(rèn)格式锈至。因此搞隐,我們需要將數(shù)據(jù)和頁面格式相匹配驹愚。
但是,后端服務(wù)中不可能說只有一個(gè)控制器劣纲。在View與Controller的交互中逢捺,往往非常多的請求服務(wù)頁面,因此如果每個(gè)頁面都去設(shè)置一個(gè)設(shè)置編碼語句癞季,不久造成不必要的代碼重復(fù)了嗎劫瞳?因此過濾器在其中扮演著規(guī)則的角色。我制定的規(guī)則绷柒,在我過濾的范圍內(nèi)都需要執(zhí)行志于。
過濾器API
只需要實(shí)現(xiàn)Filter接口,和它的三個(gè)生命周期方法就能夠使用了
其中init()和destory()和Servlet一樣的作用废睦。其中的精髓還是在于doFilter方法伺绽,它有三個(gè)參數(shù)ServletRequest,ServletResponse,FilterChain,前面兩個(gè)都很熟悉,而FilterChain非常陌生那么它是什么呢憔恳?
FilterChain瓤荔??钥组?输硝?
我們看一下它的源碼:
public interface FilterChain {
void doFilter(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws java.io.IOException, javax.servlet.ServletException;
}
看的出,它是一個(gè)interface接口程梦。里面依舊是兩個(gè)參數(shù)ServletRequest,ServletResponse点把。
其實(shí)在一個(gè)企業(yè)級項(xiàng)目中往往存在非常多的過濾器,比如在過濾編碼的同時(shí)屿附,還需要過濾登錄狀態(tài)郎逃,然后也需要過濾一些關(guān)鍵字......等等非常多過濾需求,一層一層過濾下去
[圖片上傳失敗...(image-403c27-1551666962606)]
可以看的到挺份,第一個(gè)過濾器執(zhí)行了褒翰,如果碰到FilterChain的話會執(zhí)行第二個(gè)過濾器,當(dāng)執(zhí)行完所有過濾操作后匀泊,從內(nèi)向外依次關(guān)閉优训。
Filter的配置
有兩種方法可以配置Filter,第一種是web.xml配置路徑各聘,范圍揣非,默認(rèn)值,
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>FilterDemo1</filter-class>
<init-param>
<param-name>word_file</param-name>
<param-value>/WEB-INF/word.txt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-name>子元素用于設(shè)置filter的注冊名稱躲因。**該值必須是在元素中聲明過的過濾器的名字
<url-pattern>設(shè)置 filter 所攔截的請求路徑(過濾器關(guān)聯(lián)的URL樣式)**
<servlet-name>指定過濾器所攔截的Servlet名稱**早敬。
<dispatcher>指定過濾器所攔截的資源被 Servlet 容器調(diào)用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一大脉,默認(rèn)REQUEST搞监。用戶可以設(shè)置多個(gè)
<dispatcher>子元素用來指定 Filter 對資源的多種調(diào)用方式進(jìn)行攔截。
第二種是通過注解:
@WebFilter(filterName = "FilterDemo1",urlPatterns = "/*")
過濾器是一個(gè)非常常見的東西镰矿,但是用處也是非常大的琐驴。