一,創建Filter類 1.如何創建Filter類? 創建Filter類必須實現javax.servlet.Filter接口,在該接口中定義了三個方法: (1)void init(FilterConfig config):用于完成Filter的初始化 (2)void destroy():用于Filter銷毀前,完成某些資源的回收 (3)void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):實現過濾功能 下面介紹一個日志Filter,這個Filter負責攔截用戶所有請求,并將請求的信息記錄在日志中。
二,配置Filter Filter可以認為是Servlet的“增強版”,因此配置Filter與配置Servlet非常的相似,都需要配置如下兩個部分: 1.配置Filter名 2.配置Filter攔截URL模式 Filter配置和Servlet配置的區別? Servlet通常只配置一個URL,而Filter可以同時攔截多個請求的URL。因此,在配置Filter的URL模式時通常會使用模式字符串,使得Filter可以攔截多個請求。與配置Servlet相似的是,配置Filter同樣有兩種方式 1.在Filter通過注解進行配置 2.在web.xml文件中通過配置文件進行配置
@WebFilter修飾一個Filter類,用于對Filter進行配置,它支持如下的屬性: 在web.xml文件中的配置如下
從這些代碼中可以看出配置Filter與配置Servlet非常相似,只是配置Filter時指定url-pattern為/*,即表示該Filter會攔截所有用戶請求。該Filter并未對客戶端請求進行額外的處理,僅僅在日志中簡要記錄請求的信息。 為該Web應用提供任意一個jsp頁面,并通過瀏覽器來訪問該JSP頁面,即可在Tomcat的控制臺看到信息。
實際上Filter和Servlet極其相似,區別只是Filter的doFilter()方法里多了一個FilterChain的參數,通過該參數可以控制是否放行用戶的請求,在實際項目中,Filter里doFilter()方法里的代碼就是從多個Servlet的service()方法里抽取通用代碼,通過使用Filter可以實現更好地代碼復用。 假設系統里包括多個Servlet,這些Servlet都需要進行一些的通用處理:比如權限控制,記錄日志等,這將導致在這些Servlet的service()方法中有部分代碼是相同的—–為了解決這種代碼重復的問題,可以考慮把這些通用處理提取到Filter中完成,這樣各Servlet中剩下的只是特定請求相關的處理代碼,而通用處理則交給Filter完成。
下面將定義一個較為實用的Filter,該Filter對用戶請求進行過濾,Filter將通過doFilter()方法來設置request編碼的字符集,從而避免每個JSP,Servlet都需要設置;而且還會驗證用戶是否登陸,如果用戶沒有登錄,系統直接跳轉到登陸頁面。
在web.xml文件中配置該文件的配置片段代碼如下:
相對應的JSP代碼如下
新聞熱點
疑難解答