如何手寫一個過濾器呢。假設(shè)我現(xiàn)在需要一個計時過濾器,我想把每一次調(diào)用服務(wù)鎖花費的時間打印到控制臺,我該怎么做呢?
攔截機制有三種:
1. 過濾器(Filter)能拿到http請求,但是拿不到處理請求方法的信息。
2. 攔截器(Interceptor)既能拿到http請求信息,也能拿到處理請求方法的信息,但是拿不到方法的參數(shù)信息。
3. 切片(Aspect)能拿到方法的參數(shù)信息,但是拿不到http請求信息。
他們?nèi)齻€各有優(yōu)缺點,需要根據(jù)自己的業(yè)務(wù)需求來選擇最適合的攔截機制。

攔截機制圖
好了下面開始正文。
本教程大概目錄:
1. 手寫過濾器
2. 加載第三方過濾器
好了,開始正文。
1. 手寫過濾器
特別容易,繼承Filter ,然后根據(jù)需求重寫它的三個方法。
/**
* TimeFilter 計時過濾器
* Created by Fant.J.
*/
@Component
public class TimeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("time filter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("time filter start");
long start = new Date().getTime();
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("耗時:"+(new Date().getTime() - start));
System.out.println("time filter finish");
}
@Override
public void destroy() {
System.out.println("time filter destroy");
}
}
其中 init方法是初始化方法,最先執(zhí)行。
然后執(zhí)行doFilter方法,熟悉servlet的應(yīng)該都知道,它其實就是調(diào)用業(yè)務(wù)。
最后destroy方法,是最后執(zhí)行的。
然后我們啟動服務(wù),隨便調(diào)用一個controller,控制臺打印如下:

2. 加載第三方過濾器
一般在開發(fā)的時候,我們可能用到第三方的過濾器,我們不可能在其源碼上添加@Component注解。所以我們必須寫一個配置類來引入它。
下面我們把上面的例子當作第三方過濾器,把TimeFilter類上面的@Component注解去掉。做一個模擬練習。
/**
* 引入第三方過濾器 將其放入spring容器
* Created by Fant.J.
*/
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean timeFilter(){
//創(chuàng)建 過濾器注冊bean
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
TimeFilter timeFilter = new TimeFilter();
registrationBean.setFilter(timeFilter);
List urls = new ArrayList();
urls.add("/*"); //給所有請求加過濾器
//設(shè)置 有效url
registrationBean.setUrlPatterns(urls);
return registrationBean;
}
}
注意一定要去掉TimeFilter類上面的@Component注解,否則過濾器會失效。
介紹下我的所有文集:
流行框架
SpringCloud
springboot
nginx
redis
底層實現(xiàn)原理:
Java NIO教程
Java reflection 反射詳解
Java并發(fā)學習筆錄
Java Servlet教程
jdbc組件詳解
Java NIO教程
Java語言/版本 研究