SpringBoot 手寫過濾器&加載第三方過濾器

如何手寫一個過濾器呢。假設(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語言/版本 研究

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • 什么是過濾器 過濾器是Servlet的高級特性之一,也別把它想得那么高深,只不過是實現(xiàn)Filter接口的Java類...
    Java3y閱讀 1,234評論 0 9
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,268評論 6 342
  • 構(gòu)造同步和異步操作 合并兩個獨立線程的任務(wù) 響應(yīng)事件
    上海馬超23閱讀 244評論 0 0
  • 第一章 OpenStack基礎(chǔ) OpenStack管理的資源及提供的服務(wù)OpenStack做為一個操作系統(tǒng),...
    sgt_tiger閱讀 13,231評論 4 72

友情鏈接更多精彩內(nèi)容