一,創(chuàng)建Filter類 1.如何創(chuàng)建Filter類? 創(chuàng)建Filter類必須實(shí)現(xiàn)javax.servlet.Filter接口,在該接口中定義了三個(gè)方法: (1)void init(FilterConfig config):用于完成Filter的初始化 (2)void destroy():用于Filter銷毀前,完成某些資源的回收 (3)void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):實(shí)現(xiàn)過濾功能 下面介紹一個(gè)日志Filter,這個(gè)Filter負(fù)責(zé)攔截用戶所有請(qǐng)求,并將請(qǐng)求的信息記錄在日志中。

二,配置Filter Filter可以認(rèn)為是Servlet的“增強(qiáng)版”,因此配置Filter與配置Servlet非常的相似,都需要配置如下兩個(gè)部分: 1.配置Filter名 2.配置Filter攔截URL模式 Filter配置和Servlet配置的區(qū)別? Servlet通常只配置一個(gè)URL,而Filter可以同時(shí)攔截多個(gè)請(qǐng)求的URL。因此,在配置Filter的URL模式時(shí)通常會(huì)使用模式字符串,使得Filter可以攔截多個(gè)請(qǐng)求。與配置Servlet相似的是,配置Filter同樣有兩種方式 1.在Filter通過注解進(jìn)行配置 2.在web.xml文件中通過配置文件進(jìn)行配置
@WebFilter修飾一個(gè)Filter類,用于對(duì)Filter進(jìn)行配置,它支持如下的屬性:
在web.xml文件中的配置如下
從這些代碼中可以看出配置Filter與配置Servlet非常相似,只是配置Filter時(shí)指定url-pattern為/*,即表示該Filter會(huì)攔截所有用戶請(qǐng)求。該Filter并未對(duì)客戶端請(qǐng)求進(jìn)行額外的處理,僅僅在日志中簡(jiǎn)要記錄請(qǐng)求的信息。 為該Web應(yīng)用提供任意一個(gè)jsp頁面,并通過瀏覽器來訪問該JSP頁面,即可在Tomcat的控制臺(tái)看到信息。
實(shí)際上Filter和Servlet極其相似,區(qū)別只是Filter的doFilter()方法里多了一個(gè)FilterChain的參數(shù),通過該參數(shù)可以控制是否放行用戶的請(qǐng)求,在實(shí)際項(xiàng)目中,F(xiàn)ilter里doFilter()方法里的代碼就是從多個(gè)Servlet的service()方法里抽取通用代碼,通過使用Filter可以實(shí)現(xiàn)更好地代碼復(fù)用。 假設(shè)系統(tǒng)里包括多個(gè)Servlet,這些Servlet都需要進(jìn)行一些的通用處理:比如權(quán)限控制,記錄日志等,這將導(dǎo)致在這些Servlet的service()方法中有部分代碼是相同的—–為了解決這種代碼重復(fù)的問題,可以考慮把這些通用處理提取到Filter中完成,這樣各Servlet中剩下的只是特定請(qǐng)求相關(guān)的處理代碼,而通用處理則交給Filter完成。
下面將定義一個(gè)較為實(shí)用的Filter,該Filter對(duì)用戶請(qǐng)求進(jìn)行過濾,F(xiàn)ilter將通過doFilter()方法來設(shè)置request編碼的字符集,從而避免每個(gè)JSP,Servlet都需要設(shè)置;而且還會(huì)驗(yàn)證用戶是否登陸,如果用戶沒有登錄,系統(tǒng)直接跳轉(zhuǎn)到登陸頁面。
在web.xml文件中配置該文件的配置片段代碼如下:
相對(duì)應(yīng)的JSP代碼如下

新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注