springboot實(shí)現(xiàn)過濾器的示例代碼
一 過濾器介紹
1.1 過濾器概念
過濾器,即filter,它是javaWeb三大組件之一(Servlet程序、Listener監(jiān)聽器、Filter過濾器)
作用:既可以對(duì)請(qǐng)求進(jìn)行攔截,也可以對(duì)響應(yīng)進(jìn)行處理。常用于做權(quán)限檢查,記錄日志操作、攔截過濾請(qǐng)求、對(duì)請(qǐng)求字符設(shè)置編碼等。
1.2 過濾器生命周期
SpringBoot定義一個(gè)過濾器很簡(jiǎn)單,只需要實(shí)現(xiàn)Filter類,然后重寫它的3個(gè)方法即可。
- init方法:程序啟動(dòng)調(diào)用Filter的init()方法,永遠(yuǎn)只調(diào)用一次;在容器中創(chuàng)建當(dāng)前過濾器的時(shí)候自動(dòng)調(diào)用這個(gè)方法。
- destory方法:程序停止調(diào)用Filter的destroy()方法,永遠(yuǎn)只調(diào)用一次;在容器中銷毀當(dāng)前過濾器的時(shí)候自動(dòng)調(diào)用這個(gè)方法。
- doFilter方法:每次的訪問請(qǐng)求如果符合攔截條件都會(huì)調(diào)用doFilter()方法,程序第一次運(yùn)行,會(huì)在servlet調(diào)用init()方法以后調(diào)用doFilter()方法;不管第幾次請(qǐng)求,都是在調(diào)用servlet的doGet(),doPost()方法之前調(diào)用。這個(gè)方法有3個(gè)參數(shù),分別是ServletRequest、ServletResponse和FilterChain,可以從這些參數(shù)中獲取HttpServletReguest和HttpServletResponse對(duì)象進(jìn)行相應(yīng)的處理操作。
二 SpringBoot中過濾器的兩種實(shí)現(xiàn)方式
2.1 注解方式實(shí)現(xiàn)過濾器
首先需要在啟動(dòng)類加 @ServletComponentScan 注解,啟動(dòng)類如下
import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication @MapperScan("com.ts.myt.dao") @ServletComponentScan // 過濾器 public class MytApplication { public static void main(String[] args) { SpringApplication.run(MytApplication.class, args); } }
編寫過濾器,實(shí)現(xiàn)Filter接口
import com.alibaba.fastjson.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.PrintWriter; /** * @Author:sgw * @Date:2023/9/15 * @Description: 使用注解方式實(shí)現(xiàn)過濾器(@WebFilter) */ @WebFilter(urlPatterns = "/user/*", filterName = "filter1") public class MyFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(MyFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { // Filter.super.init(filterConfig); logger.info("MyFilterInit1"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException, IOException { logger.info("doFilter"); HttpServletRequest request = (HttpServletRequest) servletRequest; String token = request.getHeader("token"); logger.info("token值:{}", token); if (token != null) { //該方法執(zhí)行后直接運(yùn)行至下一個(gè)過濾器 filterChain.doFilter(servletRequest, servletResponse); } else { servletResponse.setCharacterEncoding("UTF-8"); servletResponse.setContentType("application/json; charset=utf-8"); PrintWriter out = servletResponse.getWriter(); JSONObject res = new JSONObject(); res.put("msg", "錯(cuò)誤"); res.put("success", "false"); out.append(res.toString()); } } @Override public void destroy() { // Filter.super.destroy(); logger.info("destroy"); } }
上邊對(duì)請(qǐng)求頭header做了過濾,即請(qǐng)求頭里必須含有key為token的值,才能繼續(xù)訪問具體接口,否則該請(qǐng)求就終止訪問接口了
2.2 非注解方式實(shí)現(xiàn)過濾器(直接注入到spring中)
定義過濾器,同樣實(shí)現(xiàn)Filter接口
import com.alibaba.fastjson.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.PrintWriter; /** * @Author:sgw * @Date:2023/9/15 * @Description: 過濾器實(shí)現(xiàn)方式二:使用非注解方式實(shí)現(xiàn)過濾器(直接注入到spring中) */ public class MyFilter2 implements Filter { private static final Logger logger = LoggerFactory.getLogger(MyFilter2.class); @Override public void init(FilterConfig filterConfig) throws ServletException { logger.info("MyFilterInit2"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException, IOException { System.out.println("doFilter"); HttpServletRequest request = (HttpServletRequest) servletRequest; String token = request.getHeader("token"); System.out.println(token); //該方法執(zhí)行后直接運(yùn)行至下一個(gè)過濾器 if(token!=null){ filterChain.doFilter(servletRequest, servletResponse); }else{ servletResponse.setCharacterEncoding("UTF-8"); servletResponse.setContentType("application/json; charset=utf-8"); PrintWriter out = servletResponse.getWriter(); JSONObject res = new JSONObject(); res.put("msg", "錯(cuò)誤"); res.put("success", "false"); out.append(res.toString()); } } @Override public void destroy() { System.out.println("destroy"); } }
編寫過濾器配置類
import com.ts.myt.filter.MyFilter2; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author:sgw * @Date:2023/9/15 * @Description: 方式二的過濾器配置文件 */ @Configuration public class MyFilter2Config { // Filter代碼類 @Bean public MyFilter2 myFilter2() { return new MyFilter2(); } @Bean public FilterRegistrationBean getFilterRegistrationBean(MyFilter2 myFilter2) { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(myFilter2); filterRegistrationBean.setOrder(2); filterRegistrationBean.addUrlPatterns("/user/*"); filterRegistrationBean.setName("tokenFilter2"); return filterRegistrationBean; } }
效果與方式一一樣。
到此這篇關(guān)于springboot實(shí)現(xiàn)過濾器的示例代碼的文章就介紹到這了,更多相關(guān)springboot 過濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合sharding-jdbc實(shí)現(xiàn)自定義分庫(kù)分表的實(shí)踐
本文主要介紹了SpringBoot整合sharding-jdbc實(shí)現(xiàn)自定義分庫(kù)分表的實(shí)踐,將通過自定義算法來實(shí)現(xiàn)定制化的分庫(kù)分表來擴(kuò)展相應(yīng)業(yè)務(wù),感興趣的可以了解一下2021-11-11Java的數(shù)據(jù)類型和參數(shù)傳遞(詳解)
下面小編就為大家?guī)硪黄狫ava的數(shù)據(jù)類型和參數(shù)傳遞(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07基于SpringBoot和Vue實(shí)現(xiàn)頭像上傳與回顯功能
在現(xiàn)代Web應(yīng)用中,用戶個(gè)性化體驗(yàn)尤為重要,其中頭像上傳與回顯是一個(gè)常見的功能需求,本文將詳細(xì)介紹如何使用Spring Boot和Vue.js構(gòu)建一個(gè)前后端協(xié)同工作的頭像上傳系統(tǒng),并實(shí)現(xiàn)圖片的即時(shí)回顯,需要的朋友可以參考下2024-08-08SpringData JPA基本/高級(jí)/多數(shù)據(jù)源的使用詳解
這篇文章主要介紹了SpringData JPA基本/高級(jí)/多數(shù)據(jù)源的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java 獲取當(dāng)前設(shè)備的 IP 地址(最新推薦)
Internet 協(xié)議 (IP) 地址可以是連接到 TCP/IP 網(wǎng)絡(luò)的每個(gè)設(shè)備的標(biāo)識(shí)符,該標(biāo)識(shí)符用于識(shí)別和定位中間通信的節(jié)點(diǎn),這篇文章主要介紹了在 Java 中獲取當(dāng)前設(shè)備的 IP 地址,需要的朋友可以參考下2023-06-06java中以DES的方式實(shí)現(xiàn)對(duì)稱加密并提供密鑰的實(shí)例
這篇文章主要介紹了java中以DES的方式實(shí)現(xiàn)對(duì)稱加密并提供密鑰的實(shí)例的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分知識(shí),需要的朋友可以參考下2017-08-08Java異常(Exception)處理以及常見異??偨Y(jié)
在《Java編程思想》中這樣定義異常,阻止當(dāng)前方法或作用域繼續(xù)執(zhí)行的問題,雖然java中有異常處理機(jī)制,但是要明確一點(diǎn),決不應(yīng)該用"正常"的態(tài)度來看待異常,這篇文章主要給大家介紹了關(guān)于Java異常(Exception)處理以及常見異常的相關(guān)資料,需要的朋友可以參考下2021-10-10