最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一 過(guò)濾器介紹

1.1 過(guò)濾器概念

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

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

1.2 過(guò)濾器生命周期

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

  • init方法:程序啟動(dòng)調(diào)用Filter的init()方法,永遠(yuǎn)只調(diào)用一次;在容器中創(chuàng)建當(dāng)前過(guò)濾器的時(shí)候自動(dòng)調(diào)用這個(gè)方法。
  • destory方法:程序停止調(diào)用Filter的destroy()方法,永遠(yuǎn)只調(diào)用一次;在容器中銷毀當(dāng)前過(guò)濾器的時(shí)候自動(dòng)調(diào)用這個(gè)方法。
  • doFilter方法:每次的訪問(wèn)請(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中過(guò)濾器的兩種實(shí)現(xiàn)方式

2.1 注解方式實(shí)現(xiàn)過(guò)濾器

首先需要在啟動(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 // 過(guò)濾器
public class MytApplication {
    public static void main(String[] args) {
        SpringApplication.run(MytApplication.class, args);
    }
}

編寫過(guò)濾器,實(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)過(guò)濾器(@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è)過(guò)濾器
            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做了過(guò)濾,即請(qǐng)求頭里必須含有key為token的值,才能繼續(xù)訪問(wèn)具體接口,否則該請(qǐng)求就終止訪問(wèn)接口了

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

定義過(guò)濾器,同樣實(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: 過(guò)濾器實(shí)現(xiàn)方式二:使用非注解方式實(shí)現(xiàn)過(guò)濾器(直接注入到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è)過(guò)濾器
        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");
    }
}

編寫過(guò)濾器配置類

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: 方式二的過(guò)濾器配置文件
 */
@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ò)濾器的示例代碼的文章就介紹到這了,更多相關(guān)springboot 過(guò)濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot 實(shí)現(xiàn)記錄業(yè)務(wù)日志和異常業(yè)務(wù)日志的操作

    springboot 實(shí)現(xiàn)記錄業(yè)務(wù)日志和異常業(yè)務(wù)日志的操作

    這篇文章主要介紹了springboot 實(shí)現(xiàn)記錄業(yè)務(wù)日志和異常業(yè)務(wù)日志的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java8 日期和時(shí)間類的基本使用

    Java8 日期和時(shí)間類的基本使用

    這篇文章主要介紹了Java 日期和時(shí)間類的基本使用,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-08-08
  • SpringBoot 策略模式實(shí)現(xiàn)切換上傳文件模式

    SpringBoot 策略模式實(shí)現(xiàn)切換上傳文件模式

    策略模式是指有一定行動(dòng)內(nèi)容的相對(duì)穩(wěn)定的策略名稱,這篇文章主要介紹了SpringBoot 策略模式 切換上傳文件模式,需要的朋友可以參考下
    2023-11-11
  • 詳解Spring Security中權(quán)限注解的使用

    詳解Spring Security中權(quán)限注解的使用

    這篇文章主要為大家詳細(xì)介紹一下Spring Security中權(quán)限注解的使用方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以參考一下
    2022-05-05
  • 解決JPA?save()方法null值覆蓋掉mysql預(yù)設(shè)的默認(rèn)值問(wèn)題

    解決JPA?save()方法null值覆蓋掉mysql預(yù)設(shè)的默認(rèn)值問(wèn)題

    這篇文章主要介紹了解決JPA?save()方法null值覆蓋掉mysql預(yù)設(shè)的默認(rèn)值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java @RequestMapping注解功能使用詳解

    Java @RequestMapping注解功能使用詳解

    通過(guò)@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • SpringBoot實(shí)現(xiàn)圖片上傳及本地訪問(wèn)

    SpringBoot實(shí)現(xiàn)圖片上傳及本地訪問(wèn)

    在SpringBoot項(xiàng)目中,處理靜態(tài)文件訪問(wèn)尤其是實(shí)時(shí)更新的文件如商品圖片,可通過(guò)配置WebMvcConfig將本地文件映射到URL路徑上,以解決重啟項(xiàng)目才能訪問(wèn)文件的問(wèn)題,本文詳解如何保存和訪問(wèn)這些文件,幫助開(kāi)發(fā)者優(yōu)化項(xiàng)目文件管理
    2022-09-09
  • Javaweb使用Maven工具與Tomcat的方法詳解

    Javaweb使用Maven工具與Tomcat的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Javaweb使用Maven工具與Tomcat的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 基于HashMap遍歷和使用方法(詳解)

    基于HashMap遍歷和使用方法(詳解)

    下面小編就為大家?guī)?lái)一篇基于HashMap遍歷和使用方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 詳解MyBatis Plus中分頁(yè)插件的使用

    詳解MyBatis Plus中分頁(yè)插件的使用

    這篇文章主要為大家詳細(xì)介紹了MyBatis Plus中分頁(yè)插件使用的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-02-02

最新評(píng)論

阳泉市| 连平县| 柘城县| 昌黎县| 克什克腾旗| 蓬安县| 姚安县| 宜川县| 丹东市| 彭山县| 武城县| 监利县| 大方县| 涡阳县| 错那县| 南召县| 密山市| 洛南县| 泰安市| 承德县| 临安市| 防城港市| 会理县| 三亚市| 五峰| 治县。| 昭平县| 平定县| 南宫市| 行唐县| 昂仁县| 宜章县| 壤塘县| 涟源市| 那曲县| 鄂托克前旗| 集安市| 昌宁县| 定结县| 屏南县| 南乐县|