一、在spring的應(yīng)用中我們存在兩種過(guò)濾的用法,一種是攔截器、另外一種當(dāng)然是過(guò)濾器。我們這里介紹過(guò)濾器在springboot的用法,在springmvc中的用法基本上一樣,只是配置上面有點(diǎn)區(qū)別。
二、filter功能,它使用戶可以改變一個(gè) request和修改一個(gè)response. Filter 不是一個(gè)servlet,它不能產(chǎn)生一個(gè)response,它能夠在一個(gè)request到達(dá)servlet之前預(yù)處理request,也可以在離開(kāi) servlet時(shí)處理response.換種說(shuō)法,filter其實(shí)是一個(gè)”servlet chaining”(servlet 鏈).
一個(gè)Filter包括:
1)、在servlet被調(diào)用之前截獲;
2)、在servlet被調(diào)用之前檢查servlet request;
3)、根據(jù)需要修改request頭和request數(shù)據(jù);
4)、根據(jù)需要修改response頭和response數(shù)據(jù);
5)、在servlet被調(diào)用之后截獲.
1、Filter的應(yīng)用場(chǎng)景
通過(guò)對(duì)filter過(guò)濾器的了解,可以得知在以下三種情況下可以做些處理:
1> 通過(guò)控制對(duì)chain.doFilter的方法的調(diào)用,來(lái)決定是否需要訪問(wèn)目標(biāo)資源。
比如,可以在用戶權(quán)限驗(yàn)證等等。判斷用戶是否有訪問(wèn)某些資源的權(quán)限,有權(quán)限放行,沒(méi)權(quán)限不執(zhí)行chain.doFilter方法。
2> 通過(guò)在調(diào)用chain.doFilter方法之前,做些處理來(lái)達(dá)到某些目的。
比如,解決中文亂碼的問(wèn)題等等??梢栽赿oFilter方法前,執(zhí)行設(shè)置請(qǐng)求編碼與響應(yīng)的編碼。甚至可以對(duì)request接口進(jìn)行封裝裝飾來(lái)處理get請(qǐng)求方式的中文亂碼問(wèn)題(重寫(xiě)相應(yīng)的request.getParameter方法)。
3> 通過(guò)在調(diào)用chain.doFilter方法之后,做些處理來(lái)達(dá)到某些目的。
比如對(duì)整個(gè)web網(wǎng)站進(jìn)行壓縮。在調(diào)用chain.doFilter方法之前用類(lèi)A對(duì)response對(duì)象進(jìn)行封裝裝飾,重寫(xiě)getOutputStream和重寫(xiě)getWriter方法。在類(lèi)A內(nèi)部中,將輸出內(nèi)容緩存進(jìn)ByteArrayOutputStream流中,然后在chain.doFilter方法執(zhí)行后,獲取類(lèi)A中ByteArrayOutputStream流緩存數(shù)據(jù),用GZIPOutputStream流進(jìn)行壓縮下。
2、Filter實(shí)現(xiàn)攔截的原理
Filter接口中有一個(gè)doFilter方法,當(dāng)開(kāi)發(fā)人員編寫(xiě)好Filter類(lèi)實(shí)現(xiàn)doFilter方法,并配置對(duì)哪個(gè)web資源進(jìn)行攔截后,WEB服務(wù)器每次在調(diào)用web資源的service方法之前(服務(wù)器內(nèi)部對(duì)資源的訪問(wèn)機(jī)制決定的),都會(huì)先調(diào)用一下filter的doFilter方法。
3、過(guò)濾規(guī)則
1
2
3
4
5
6
7
8
|
//過(guò)濾應(yīng)用程序中所有資源,當(dāng)前應(yīng)用程序根下的所有文件包括多級(jí)子目錄下的所有文件,注意這里*前有“/” registration.addUrlPatterns( "/*" ); //過(guò)濾指定的類(lèi)型文件資源, 當(dāng)前應(yīng)用程序根目錄下的所有html文件,注意:*.html前沒(méi)有“/”,否則錯(cuò)誤 registration.addUrlPatterns( ".html" ); //過(guò)濾指定的目錄下的所有文件,當(dāng)前應(yīng)用程序根目錄下的folder_name子目錄(可以是多級(jí)子目錄)下所有文件 registration.addUrlPatterns( "/folder_name/*" ); //過(guò)濾指定文件 registration.addUrlPatterns( "/index.html" ); |
三、應(yīng)用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
@Component @ServletComponentScan @WebFilter (urlPatterns = "/login/*" ,filterName = "loginFilter" ) public class LoginFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } @Override public void destroy() { } } |
四、解釋?zhuān)?/strong>
1、@Component 這個(gè)注解的目的是將LoginFilter交給容器來(lái)處理。也就是讓LoginFilter起作用
2、@ServletComponentScan 這個(gè)使用來(lái)掃描@WebFilter 的讓@WebFilter起作用。當(dāng)然對(duì)于servlet線管注解也是可以的。這個(gè)@ServletComponentScan最好卸載Apllication這個(gè)上面,通用配置。我這里因?yàn)橹挥幸粋€(gè)Filter所以沒(méi)有寫(xiě)在Application上面。
3、@WebFilter 這個(gè)用處顯而易見(jiàn),針對(duì)于什么鏈接做過(guò)濾,filter的名稱(chēng)是為什么。
五、簡(jiǎn)單介紹一下springmvc中的Filter的用法
1、寫(xiě)的方法還是一樣的都是繼承Filter,來(lái)實(shí)現(xiàn)3個(gè)方法處理
2、丟入容器:這個(gè)需要配置在web.xml里面
1
2
3
4
5
6
7
8
|
< filter > < filter-name >loginFilter</ filter-name > < filter-class >com.troy.boot.filter.LoginFilter</ filter-class > </ filter > < filter-mapping > < filter-name >loginFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > |
3、具體的用法可以自己研究。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://www.cnblogs.com/ll409546297/p/7422833.html