springboot整合過濾器實戰(zhàn)步驟
下面先建立一個MVC的基本請求接口,如下:
一、普通的接口訪問

如上,先新增一個testController。

先用postman測試一下通不通。

結(jié)果是通的,準(zhǔn)備工作完成。
二、增加一個過濾器
下面增加一個過濾器來實現(xiàn)一個接口攔截并處理token校驗的模擬。
簡單處理,有如下兩個步驟。
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
*/
//實現(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("第一個過濾器成功初始化。。。。。。。。。。。。。");
}
//doFilter()方法有多個參數(shù),其中
//參數(shù)request和response為Web服務(wù)器或Filter鏈中的上一個Filter傳遞過來的請求和響應(yīng)對象;
//參數(shù)chain代表當(dāng)前Filter鏈的對象,
//只有在當(dāng)前Filter對象中的doFilter()方法內(nèi)部需要調(diào)用FilterChain對象的doFilter()法才能把請求交付給Filter鏈中的下一個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("過濾器被銷毀");
}
}實現(xiàn)servlet的Filter接口,并重寫他的三個方法,分別是init,doFilter,destroy。
- init:過濾器初始化時回調(diào),可以在這里做過濾器的初始化操作,例如設(shè)置白名單路徑列表。
- doFilter:過濾器初始化后并在請求到達(dá)后端且進(jìn)入到注冊過濾器設(shè)置的匹配路徑時回調(diào)。
- destroy:過濾器銷毀時回調(diào)。
上圖是一個簡單實現(xiàn)token校驗是否為空,沒有進(jìn)行正確與否的校驗,可以引入redis(前面章節(jié)有講到)或者其他的存儲,然后進(jìn)行一個正確性的校驗。從request中獲取token頭,若存在則調(diào)用doFilter方法(通過過濾器),否則不作操作(就是不通過過濾器,不會抵達(dá)controller)。
2、注冊到容器

@Configuration
public class TestFilterConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean(){
//創(chuàng)建一個注冊過濾器對象
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
//設(shè)置自定義過濾器
registrationBean.setFilter(new TestFilter());
//設(shè)置過濾攔截匹配規(guī)則,/*是匹配所有
// registrationBean.addUrlPatterns("/*");
//只攔截testController下面的接口
registrationBean.addUrlPatterns("/testController/*");
//存在多個過濾器時,設(shè)置執(zhí)行順序,值越大,執(zhí)行順序越靠后
registrationBean.setOrder(2);
//返回這個注冊過濾器對象
return registrationBean;
}
}將自定義過濾器注冊到容器中,通過FilterRegistrationBean的一系列方法設(shè)置過濾器的參數(shù),例如需要過濾的路徑,過濾器的優(yōu)先級等等。
3、演示一下效果:
不帶token:


帶token:

三、增加兩個過濾器
下面再整一下當(dāng)存在多個過濾器時,怎么設(shè)置哪一個過濾器先攔截,哪一個后執(zhí)行(優(yōu)先級)。
跟第二節(jié)一樣,再整一個自定義過濾器。

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
*/
//實現(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("第二個過濾器成功初始化。。。。。。。。。。。。。");
}
//doFilter()方法有多個參數(shù),其中
//參數(shù)request和response為Web服務(wù)器或Filter鏈中的上一個Filter傳遞過來的請求和響應(yīng)對象;
//參數(shù)chain代表當(dāng)前Filter鏈的對象,
//只有在當(dāng)前Filter對象中的doFilter()方法內(nèi)部需要調(diào)用FilterChain對象的doFilter()法才能把請求交付給Filter鏈中的下一個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("過濾器被銷毀");
}
}修改注冊過濾器的類。

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

調(diào)用接口后發(fā)現(xiàn),先進(jìn)入了第一個過濾器的doFilter方法,再進(jìn)入的第二個過濾器的doFilter方法,驗證order參數(shù)是有效的。
到此這篇關(guān)于springboot整合過濾器實戰(zhàn)的文章就介紹到這了,更多相關(guān)springboot整合過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MAC?在類路徑或引導(dǎo)類路徑中找不到程序包?java.lang問題
這篇文章主要介紹了MAC?在類路徑或引導(dǎo)類路徑中找不到程序包?java.lang問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
Springboot工具類FileCopyUtils使用教程
這篇文章主要介紹了Springboot內(nèi)置的工具類之FileCopyUtils的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼
Ribbon 是 Netflix 發(fā)布的負(fù)載均衡器,它有助于控制 HTTP 和 TCP 客戶端的行為。這篇文章主要介紹了Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼,需要的朋友可以參考下2020-11-11

