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

相关文章
相关标签/搜索