springboot整合過濾器實(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處理時(shí)間格式CST和GMT轉(zhuǎn)換方法示例
這篇文章主要給大家介紹了關(guān)于Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法的相關(guān)資料,相信很多小伙伴在時(shí)間格式轉(zhuǎn)換的時(shí)候非常頭疼,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09springboot項(xiàng)目訪問圖片的3種實(shí)現(xiàn)方法(親測可用)
本文主要介紹了springboot項(xiàng)目訪問圖片的3種實(shí)現(xiàn)方法,通過springboot項(xiàng)目訪問除項(xiàng)目根目錄之外的其它目錄的圖片,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例詳解
這篇文章主要介紹了Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例,簡單描述了裝飾者模式的概念、原理及Java使用裝飾者模式的相關(guān)實(shí)現(xiàn)步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05JAVA多線程與并發(fā)學(xué)習(xí)總結(jié)分析
以下是對小編對JAVA多線程與并發(fā)的學(xué)習(xí)進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下2013-08-08