簡介
依賴于servlet容器。在實現(xiàn)上基于函數(shù)回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。
使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的數(shù)據(jù)。
WEB開發(fā)人員通過Filter技術,對web服務器管理的所有web資源:例如JSP,Servlet,靜態(tài)圖片文件或靜態(tài)HTML文件進行攔截,從而實現(xiàn)一些特殊功能。例如實現(xiàn)URL級別的權限控制、過濾敏感詞匯、壓縮響應信息、過濾器中修改字符編碼等一些高級功能。
Filter工作原理
當客戶端發(fā)出Web資源的請求時,Web服務器根據(jù)應用程序配置文件設置的過濾規(guī)則進行檢查,若客戶請求滿足過濾規(guī)則,則對客戶請求/響應進行攔截,對請求頭和請求數(shù)據(jù)進行檢查或改動,并依次通過過濾器鏈,最后把請求/響應交給請求的Web資源處理。請求信息在過濾器鏈中可以被修改,也可以根據(jù)條件讓請求不發(fā)往資源處理器,并直接向客戶機發(fā)回一個響應。當資源處理器完成了對資源的處理后,響應信息將逐級逆向返回。同樣在這個過程中,用戶可以修改響應信息,從而完成一定的任務
常見問題
Web開發(fā)中,自定義過濾器被執(zhí)行兩次的原因分析。
導致原因:第一次打印的是我請求的Servlet,第二次打印的是/favicon.ico
1、@WebFilter配置Filter過濾器
@Configuration//將此Filter交給Spring容器管理 @WebFilter(urlPatterns = "/*", filterName
= "logFilter2") @Order(1)//指定過濾器的執(zhí)行順序,值越大越靠后執(zhí)行 public class LogCostFilter2
implements Filter { @Override public void init(FilterConfig filterConfig)
throws ServletException { System.out.println("過濾器2-init"); } @Override public
void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("過濾器2-doFilter-前"); long start = System.currentTimeMillis();
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("LogFilter2 Execute cost=" + (System.currentTimeMillis() -
start)); System.out.println("過濾器2-doFilter-后"); } @Override public void
destroy() { System.out.println("過濾器2-destroy"); }
}
2、FilterRegistrationBean配置Filter過濾器
public class LogCostFilter implements Filter { @Override public void
init(FilterConfig filterConfig) throws ServletException {
System.out.println("過濾器1-init"); } @Override public void
doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("過濾器1-doFilter-前"); long start = System.currentTimeMillis();
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("LogFilter1 Execute
cost="+(System.currentTimeMillis()-start));
System.out.println("過濾器1-doFilter-后"); } @Override public void destroy() {
System.out.println("過濾器1-destroy"); } }
使用FilterRegistrationBean來完成配置
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean
registFilter() { FilterRegistrationBean registration = new
FilterRegistrationBean(); registration.setFilter(new LogCostFilter());
registration.addUrlPatterns("/*"); registration.setName("LogCostFilter");
registration.setOrder(1); return registration; }
}
測試用例
@GetMapping("/filter/{id}") public void filter(@PathVariable("id") Long id) {
System.out.println("Controller方法--前"); UserEntity userEntity =
userService.findUserById(id); System.out.println("Controller方法--后"); }
運行結構
熱門工具 換一換