java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot项目中filter的使用

SpringBoot项目中filter的两种使用详解

作者:0和1搭建网络世界

文章介绍了两种方式在Spring Boot中创建和配置过滤器:使用`@WebFilter`注解和`@ServletComponentScan`注解,以及通过`@Bean`注解自定义过滤器并加载到IOC容器,通过测试启动项目并访问指定URL,可以查看控制台打印的过滤器执行顺序结果

一、添加依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
    </dependencies>

二、@WebFilter方式

@WebFilter(filterName = "myFilter",urlPatterns = "/*")
@Slf4j
@Order(value = 2) //存在多个filter时 指定filter执行顺序
public class MyFilter02 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("=======过滤器初始化2=======");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        log.info("过滤器2:请求的sessionID为{},请求的url为{}",httpServletRequest.getSession().getId(),httpServletRequest.getRequestURL());
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}
@SpringBootApplication
@ServletComponentScan
public class SpringBootFiltrApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootFiltrApplication.class,args);
    }
}

启动类中@ServletComponentScan注解和@WebFilter注解配合使用,@ServletComponentScan注解会自动扫描带有@WebFilter注解的类

三、@Bean注解方式

先自定义一个过滤器:

@Slf4j
public class MyFilter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("=====初始化过滤器1======");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        log.info("过滤器1:请求路径:{}",httpServletRequest.getRequestURL());
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

将自定义的过滤器加载到ioc容器中

@Configuration
public class AddFilters {

    @Bean
    public FilterRegistrationBean addFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter01());
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }
}

上面可以看出,通过两种方式分别创建了filter01和filter02两个过滤器,并分别指定了他们执行的顺序

三、测试

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/getUserInfo")
    public String getUserInfo(){
        return "获取成功";
    }
}

启动项目:访问http://localhost:8080/user/getUserInfo

查看控制台打印的结果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文