欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot整合過濾器實(shí)戰(zhàn)步驟

 更新時(shí)間:2022年04月13日 07:58:59   作者:小z♀  
在項(xiàng)目開發(fā)過程中,過濾器或者攔截器幾乎是必用的,他可以很方便的完成類似日志處理、token驗(yàn)證等一系列操作,區(qū)別于業(yè)務(wù)接口,獨(dú)立進(jìn)行處理,感覺就是一種Aop思想。下面模擬請求接口前的token驗(yàn)證,進(jìn)行過濾器的實(shí)戰(zhàn)

下面先建立一個(gè)MVC的基本請求接口,如下:

一、普通的接口訪問

如上,先新增一個(gè)testController。

先用postman測試一下通不通。

結(jié)果是通的,準(zhǔn)備工作完成。

二、增加一個(gè)過濾器

下面增加一個(gè)過濾器來實(shí)現(xiàn)一個(gè)接口攔截并處理token校驗(yàn)的模擬。

簡單處理,有如下兩個(gè)步驟。

1、自定義過濾器

package com.example.demo_filter_interceptor.config;
 
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
 
/**
 * @Classname TestFilter
 * @Description TODO
 * @Date 2022/4/11 19:30
 * @Created by zrc
 */
//實(shí)現(xiàn)Filter接口,基于回調(diào)的方式,類似ajax請求的success。
public class TestFilter implements Filter {
 
    //init方法,初始化過濾器,可以在init()方法中完成與構(gòu)造方法類似的初始化功能,
    //如果初始化代碼中要使用到FillerConfig對象,那么這些初始化代碼就只能在Filler的init()方法中編寫而不能在構(gòu)造方法中編寫
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        System.out.println("第一個(gè)過濾器成功初始化。。。。。。。。。。。。。");
    }
 
    //doFilter()方法有多個(gè)參數(shù),其中
    //參數(shù)request和response為Web服務(wù)器或Filter鏈中的上一個(gè)Filter傳遞過來的請求和響應(yīng)對象;
    //參數(shù)chain代表當(dāng)前Filter鏈的對象,
    //只有在當(dāng)前Filter對象中的doFilter()方法內(nèi)部需要調(diào)用FilterChain對象的doFilter()法才能把請求交付給Filter鏈中的下一個(gè)Filter或者目標(biāo)程序處理
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        //這里為了使用getHeader方法獲取token,轉(zhuǎn)型成HttpServletRequest
        System.out.println("token:"+req.getHeader("token"));
        String token = req.getHeader("token");
        //再判斷token是否正確
        if(null==token){
            throw new RuntimeException("token為空");
        }
        //調(diào)用doFilter方法,正常返回servletResponse
        filterChain.doFilter(servletRequest, servletResponse);
    }
 
    //destroy()方法在Web服務(wù)器卸載Filter對象之前被調(diào)用,該方法用于釋放被Filter對象打開的資源,例如關(guān)閉數(shù)據(jù)庫和I/O流
    @Override
    public void destroy() {
        Filter.super.destroy();
        System.out.println("過濾器被銷毀");
    }
}

實(shí)現(xiàn)servlet的Filter接口,并重寫他的三個(gè)方法,分別是init,doFilter,destroy。

  • init:過濾器初始化時(shí)回調(diào),可以在這里做過濾器的初始化操作,例如設(shè)置白名單路徑列表。
  • doFilter:過濾器初始化后并在請求到達(dá)后端且進(jìn)入到注冊過濾器設(shè)置的匹配路徑時(shí)回調(diào)。
  • destroy:過濾器銷毀時(shí)回調(diào)。

上圖是一個(gè)簡單實(shí)現(xiàn)token校驗(yàn)是否為空,沒有進(jìn)行正確與否的校驗(yàn),可以引入redis(前面章節(jié)有講到)或者其他的存儲(chǔ),然后進(jìn)行一個(gè)正確性的校驗(yàn)。從request中獲取token頭,若存在則調(diào)用doFilter方法(通過過濾器),否則不作操作(就是不通過過濾器,不會(huì)抵達(dá)controller)。

2、注冊到容器

@Configuration
public class TestFilterConfig {
 
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        //創(chuàng)建一個(gè)注冊過濾器對象
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        //設(shè)置自定義過濾器
        registrationBean.setFilter(new TestFilter());
        //設(shè)置過濾攔截匹配規(guī)則,/*是匹配所有
//        registrationBean.addUrlPatterns("/*");
        //只攔截testController下面的接口
        registrationBean.addUrlPatterns("/testController/*");
        //存在多個(gè)過濾器時(shí),設(shè)置執(zhí)行順序,值越大,執(zhí)行順序越靠后
        registrationBean.setOrder(2);
        //返回這個(gè)注冊過濾器對象
        return registrationBean;
    }
 
}

將自定義過濾器注冊到容器中,通過FilterRegistrationBean的一系列方法設(shè)置過濾器的參數(shù),例如需要過濾的路徑,過濾器的優(yōu)先級(jí)等等。

3、演示一下效果:

不帶token:

帶token:

三、增加兩個(gè)過濾器

下面再整一下當(dāng)存在多個(gè)過濾器時(shí),怎么設(shè)置哪一個(gè)過濾器先攔截,哪一個(gè)后執(zhí)行(優(yōu)先級(jí))。

跟第二節(jié)一樣,再整一個(gè)自定義過濾器。

package com.example.demo_filter_interceptor.config;
 
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
 
/**
 * @Classname TestFilter
 * @Description TODO
 * @Date 2022/4/11 19:30
 * @Created by zrc
 */
//實(shí)現(xiàn)Filter接口,基于回調(diào)的方式,類似ajax請求的success。
public class TestFilter2 implements Filter {
 
    //init方法,初始化過濾器,可以在init()方法中完成與構(gòu)造方法類似的初始化功能,
    //如果初始化代碼中要使用到FillerConfig對象,那么這些初始化代碼就只能在Filler的init()方法中編寫而不能在構(gòu)造方法中編寫
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        System.out.println("第二個(gè)過濾器成功初始化。。。。。。。。。。。。。");
    }
 
    //doFilter()方法有多個(gè)參數(shù),其中
    //參數(shù)request和response為Web服務(wù)器或Filter鏈中的上一個(gè)Filter傳遞過來的請求和響應(yīng)對象;
    //參數(shù)chain代表當(dāng)前Filter鏈的對象,
    //只有在當(dāng)前Filter對象中的doFilter()方法內(nèi)部需要調(diào)用FilterChain對象的doFilter()法才能把請求交付給Filter鏈中的下一個(gè)Filter或者目標(biāo)程序處理
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("這里是第一順序的攔截器");
        filterChain.doFilter(servletRequest, servletResponse);
    }
 
    //destroy()方法在Web服務(wù)器卸載Filter對象之前被調(diào)用,該方法用于釋放被Filter對象打開的資源,例如關(guān)閉數(shù)據(jù)庫和I/O流
    @Override
    public void destroy() {
        Filter.super.destroy();
        System.out.println("過濾器被銷毀");
    }
}

修改注冊過濾器的類。

類似第一個(gè)過濾器的注冊,再注冊一個(gè)第二個(gè)過濾器即可,可以設(shè)置不同的攔截路徑,各負(fù)責(zé)各的邏輯處理,此處只演示一下執(zhí)行順序問題,第一個(gè)設(shè)置Order參數(shù)為2,第二個(gè)設(shè)置為1,越大的越后執(zhí)行。設(shè)置后,用postman測試一下。

調(diào)用接口后發(fā)現(xiàn),先進(jìn)入了第一個(gè)過濾器的doFilter方法,再進(jìn)入的第二個(gè)過濾器的doFilter方法,驗(yàn)證order參數(shù)是有效的。

到此這篇關(guān)于springboot整合過濾器實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)springboot整合過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 將Java程序的輸出結(jié)果寫到txt文件中的方法

    將Java程序的輸出結(jié)果寫到txt文件中的方法

    今天小編就為大家分享一篇將Java程序的輸出結(jié)果寫到txt文件中的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法示例

    Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法示例

    這篇文章主要給大家介紹了關(guān)于Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法的相關(guān)資料,相信很多小伙伴在時(shí)間格式轉(zhuǎn)換的時(shí)候非常頭疼,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 兩種java實(shí)現(xiàn)二分查找的方式

    兩種java實(shí)現(xiàn)二分查找的方式

    這篇文章主要給大家分享的是java實(shí)現(xiàn)二分查找的方式,二分查找是一種查詢效率非常高的查找算法。又稱折半查找。下面文章我們介紹了兩種方法,需要的朋友可以參考一下
    2021-09-09
  • springboot項(xiàng)目訪問圖片的3種實(shí)現(xiàn)方法(親測可用)

    springboot項(xiàng)目訪問圖片的3種實(shí)現(xiàn)方法(親測可用)

    本文主要介紹了springboot項(xiàng)目訪問圖片的3種實(shí)現(xiàn)方法,通過springboot項(xiàng)目訪問除項(xiàng)目根目錄之外的其它目錄的圖片,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例詳解

    Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例詳解

    這篇文章主要介紹了Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例,簡單描述了裝飾者模式的概念、原理及Java使用裝飾者模式的相關(guān)實(shí)現(xiàn)步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • Java基礎(chǔ)教程之字符流文件讀寫

    Java基礎(chǔ)教程之字符流文件讀寫

    這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之字符流文件讀寫的相關(guān)資料,,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • JAVA多線程與并發(fā)學(xué)習(xí)總結(jié)分析

    JAVA多線程與并發(fā)學(xué)習(xí)總結(jié)分析

    以下是對小編對JAVA多線程與并發(fā)的學(xué)習(xí)進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下
    2013-08-08
  • 一文帶你徹底剖析Java中Synchronized原理

    一文帶你徹底剖析Java中Synchronized原理

    Synchronized是Java中的隱式鎖,它的獲取鎖和釋放鎖都是隱式的,完全交由JVM幫助我們操作,在了解Synchronized關(guān)鍵字之前,首先要學(xué)習(xí)的知識(shí)點(diǎn)就是Java的對象結(jié)構(gòu),本文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • BaseMapper接口的使用方法

    BaseMapper接口的使用方法

    這篇文章主要介紹了BaseMapper接口的使用方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • java多線程模擬交通燈管理系統(tǒng)

    java多線程模擬交通燈管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java多線程模擬交通燈管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論