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

springboot實現(xiàn)過濾器的示例代碼

 更新時間:2024年10月25日 10:43:37   作者:麥芽糖0219  
JavaWeb開發(fā)中,過濾器Filter是三大組件之一,主要用于請求攔截和響應(yīng)處理,如權(quán)限校驗、日志記錄、請求過濾等,本文就來介紹一下springboot實現(xiàn)過濾器的示例代碼,感興趣的可以了解一下

一 過濾器介紹

1.1 過濾器概念

過濾器,即filter,它是javaWeb三大組件之一(Servlet程序、Listener監(jiān)聽器、Filter過濾器)

作用:既可以對請求進行攔截,也可以對響應(yīng)進行處理。常用于做權(quán)限檢查,記錄日志操作、攔截過濾請求、對請求字符設(shè)置編碼等。

1.2 過濾器生命周期

SpringBoot定義一個過濾器很簡單,只需要實現(xiàn)Filter類,然后重寫它的3個方法即可。

  • init方法:程序啟動調(diào)用Filter的init()方法,永遠只調(diào)用一次;在容器中創(chuàng)建當前過濾器的時候自動調(diào)用這個方法。
  • destory方法:程序停止調(diào)用Filter的destroy()方法,永遠只調(diào)用一次;在容器中銷毀當前過濾器的時候自動調(diào)用這個方法。
  • doFilter方法:每次的訪問請求如果符合攔截條件都會調(diào)用doFilter()方法,程序第一次運行,會在servlet調(diào)用init()方法以后調(diào)用doFilter()方法;不管第幾次請求,都是在調(diào)用servlet的doGet(),doPost()方法之前調(diào)用。這個方法有3個參數(shù),分別是ServletRequest、ServletResponse和FilterChain,可以從這些參數(shù)中獲取HttpServletReguest和HttpServletResponse對象進行相應(yīng)的處理操作。

二 SpringBoot中過濾器的兩種實現(xiàn)方式

2.1 注解方式實現(xiàn)過濾器

首先需要在啟動類加 @ServletComponentScan 注解,啟動類如下

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);
    }
}

編寫過濾器,實現(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: 使用注解方式實現(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í)行后直接運行至下一個過濾器
            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", "錯誤");
            res.put("success", "false");
            out.append(res.toString());
        }
    }

    @Override
    public void destroy() {
//        Filter.super.destroy();
        logger.info("destroy");
    }
}

上邊對請求頭header做了過濾,即請求頭里必須含有key為token的值,才能繼續(xù)訪問具體接口,否則該請求就終止訪問接口了

2.2 非注解方式實現(xiàn)過濾器(直接注入到spring中)

定義過濾器,同樣實現(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: 過濾器實現(xiàn)方式二:使用非注解方式實現(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í)行后直接運行至下一個過濾器
        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", "錯誤");
            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實現(xiàn)過濾器的示例代碼的文章就介紹到這了,更多相關(guān)springboot 過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合sharding-jdbc實現(xiàn)自定義分庫分表的實踐

    SpringBoot整合sharding-jdbc實現(xiàn)自定義分庫分表的實踐

    本文主要介紹了SpringBoot整合sharding-jdbc實現(xiàn)自定義分庫分表的實踐,將通過自定義算法來實現(xiàn)定制化的分庫分表來擴展相應(yīng)業(yè)務(wù),感興趣的可以了解一下
    2021-11-11
  • Java的數(shù)據(jù)類型和參數(shù)傳遞(詳解)

    Java的數(shù)據(jù)類型和參數(shù)傳遞(詳解)

    下面小編就為大家?guī)硪黄狫ava的數(shù)據(jù)類型和參數(shù)傳遞(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java GUI插入圖片不顯示問題解決方法

    Java GUI插入圖片不顯示問題解決方法

    大家好,本篇文章主要講的是Java GUI插入圖片不顯示問題解決方法,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 基于SpringBoot和Vue實現(xiàn)頭像上傳與回顯功能

    基于SpringBoot和Vue實現(xiàn)頭像上傳與回顯功能

    在現(xiàn)代Web應(yīng)用中,用戶個性化體驗尤為重要,其中頭像上傳與回顯是一個常見的功能需求,本文將詳細介紹如何使用Spring Boot和Vue.js構(gòu)建一個前后端協(xié)同工作的頭像上傳系統(tǒng),并實現(xiàn)圖片的即時回顯,需要的朋友可以參考下
    2024-08-08
  • SpringData JPA基本/高級/多數(shù)據(jù)源的使用詳解

    SpringData JPA基本/高級/多數(shù)據(jù)源的使用詳解

    這篇文章主要介紹了SpringData JPA基本/高級/多數(shù)據(jù)源的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中map和flatMap的區(qū)別舉例詳解

    Java中map和flatMap的區(qū)別舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java中map和flatMap區(qū)別的相關(guān)資料,在Java中Stream接口有map()和flatmap()方法,兩者都有中間流操作,并返回另一個流作為方法輸出,需要的朋友可以參考下
    2023-10-10
  • Java 獲取當前設(shè)備的 IP 地址(最新推薦)

    Java 獲取當前設(shè)備的 IP 地址(最新推薦)

    Internet 協(xié)議 (IP) 地址可以是連接到 TCP/IP 網(wǎng)絡(luò)的每個設(shè)備的標識符,該標識符用于識別和定位中間通信的節(jié)點,這篇文章主要介紹了在 Java 中獲取當前設(shè)備的 IP 地址,需要的朋友可以參考下
    2023-06-06
  • java中以DES的方式實現(xiàn)對稱加密并提供密鑰的實例

    java中以DES的方式實現(xiàn)對稱加密并提供密鑰的實例

    這篇文章主要介紹了java中以DES的方式實現(xiàn)對稱加密并提供密鑰的實例的相關(guān)資料,這里提供實例幫助大家學習理解這部分知識,需要的朋友可以參考下
    2017-08-08
  • springboot文件虛擬路徑映射方式

    springboot文件虛擬路徑映射方式

    這篇文章主要介紹了springboot文件虛擬路徑映射方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java異常(Exception)處理以及常見異??偨Y(jié)

    Java異常(Exception)處理以及常見異??偨Y(jié)

    在《Java編程思想》中這樣定義異常,阻止當前方法或作用域繼續(xù)執(zhí)行的問題,雖然java中有異常處理機制,但是要明確一點,決不應(yīng)該用"正常"的態(tài)度來看待異常,這篇文章主要給大家介紹了關(guān)于Java異常(Exception)處理以及常見異常的相關(guān)資料,需要的朋友可以參考下
    2021-10-10

最新評論