SpringBoot系列——Filter 過濾器

  前言

  本文記錄一下在SpringBoot項目中是如何使用Filter過濾器html

 

  代碼、測試

  Filter過濾器是servlet包下面的東西,所以咱們不須要再額外引包java

  方法一

  直接實現Filter接口,並使用@Component註解標註爲組件自動注入beangit

package cn.huanzi.qch.springbootfilter.filter;

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        System.out.println("TestFilter,"+request.getRequestURI());

        //執行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

  查看日誌能夠發現,SpringBoot已經幫咱們注入了一個filter,攔截路徑是/*,攔截全部,若是咱們須要進一步攔截具體的則須要咱們本身在代碼裏控制github

 

 

  方法二

  實現Filter接口,用@WebFilter註解,指定攔截路徑以及一些參數,同時須要在啓動類使用@ServletComponentScan掃描帶@WebFilter、@WebServlet、@WebListener並將幫咱們注入bean
web

  請看官網介紹:https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners-scanningspring

 

package cn.huanzi.qch.springbootfilter.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//配置攔截路徑
@WebFilter(filterName = "testFilter",urlPatterns = {"/test"})
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        System.out.println("TestFilter,"+request.getRequestURI());

        //執行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}
package cn.huanzi.qch.springbootfilter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

//自動掃描與當前類的同包以及子包
@ServletComponentScan
@SpringBootApplication
public class SpringbootFilterApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootFilterApplication.class, args);
    }

}

   查看日誌發現,以及幫咱們注入了testFilter,攔截路徑是/testspringboot

  只指定攔截路徑,不設置filterName同樣能夠注入ide

//配置攔截路徑
@WebFilter({"/test"})

 

  方法三

   固然了,咱們也能夠既使用@Component同時也使用@WebFilterspring-boot

package cn.huanzi.qch.springbootfilter.filter;

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


//配置攔截路徑
@WebFilter(filterName = "testFilter",urlPatterns = {"/test"})
@Component
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        System.out.println("TestFilter,"+request.getRequestURI());

        //執行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}
package cn.huanzi.qch.springbootfilter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

//自動掃描與當前類的同包以及子包
@ServletComponentScan
@SpringBootApplication
public class SpringbootFilterApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootFilterApplication.class, args);
    }

}

  可是作會注入兩個bean,若是你的@WebFilter沒有指定filterName或者指定的名稱與類名相同,因爲注入兩個相同名稱的bean,程序啓動報錯,叫咱們修改其中一個的名字,或者啓用覆蓋bean測試

  這裏建議若是你硬要採用第三種方法,最好啓用覆蓋,由於更名將會注入兩個bean,處理邏輯同樣但攔截路徑不同,這並非咱們想要的,例如:

  啓用覆蓋

#啓用覆蓋同名bean
spring.main.allow-bean-definition-overriding=true

  PS:這裏額外說一點,若是咱們採用第三種方法,@ServletComponentScan放在TestFilter類上@WebFilter也會被掃描到,不須要放在啓動類,第二種方法若是也這樣作就不行,估計是受到了@Component註解的影響

//配置攔截路徑
@WebFilter(filterName = "testFilter",urlPatterns = {"/test"})
@ServletComponentScan
@Component
public class TestFilter implements Filter

 

 

  後記

  Filter過濾器暫時先記錄到這,之後再進行補充

 

  代碼開源

  代碼已經開源、託管到個人GitHub、碼雲:

  GitHub:https://github.com/huanzi-qch/springBoot

  碼雲:https://gitee.com/huanzi-qch/springBoot

相關文章
相關標籤/搜索