【Spring Boot系列】-Spring Boot过滤器Filter

【Spring Boot系列】-Spring Boot过滤器Filter

文章目录

一、概述

**Filter(过滤器)可以理解为经过一层次的过滤处理才达到使用的要求,而其实 Filter(过滤器)就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Filter(过滤器)**主要用于对浏览器的请求进行过滤处理,将过滤后的请求再转给下一个资源。

**Filter(过滤器)**是一个小型web组件,它们通过拦截请求和响应,以便查看、提取或以某种方式操作客户端和服务器之间交换的数据,实现"过滤"的功能。Filter通常封装了一些功能的web组件,过滤器提供了一种面向对象的模块化机制,将任务封装到一个可插入的组件中, Filter组件通过配置文件来声明,并动态的代理。

二、Filter(过滤器)数据流程

  1. 接收用户请求,处理用户请求
  2. Filter:拦截用户请求
  3. Listener:监听器

三、Spring Boot 过滤器生命周期

使用过滤器很简单,只需要实现Filter类,然后重写它的3个方法即可。

  • init方法:程序启动调用Filter的init()方法(永远只调用一次);在容器中创建当前过滤器的时候自动调用这个方法。
  • destory方法:程序停止调用Filter的destroy()方法(永远只调用一次);在容器中销毁当前过滤器的时候自动调用这个方法。
  • doFilter方法:doFilter()方法每次的访问请求如果符合拦截条件都会调用(程序第一次运行,会在servlet调用init()方法以后调用;不管第几次,都在调用doGet(),doPost()方法之前)。这个方法有3个参数,分别是ServletRequest、ServletResponse和FilterChain可以从参数中获取HttpServletReguest和HttpServletResponse对象进行相应的处理操作。

四、使用注解方式实现过滤器(@WebFilter)

4.1. 在springboot 启动类添加该注解@ServletComponentScan

java 复制代码
@SpringBootApplication
@ServletComponentScan // 过滤器
public class SpringbootFilterApplication {
    SpringApplication.run(SpringbootFilterApplication.class, args);
}

4.2. 写个过滤器类,实现Filter接口

java 复制代码
@Component
@WebFilter(urlPatterns = "/filter/*", filterName = "myTestFilter") 
@Slf4
public class MyTestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("[ {} ] 创建啦...", this.getClass().getSimpleName());
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("[ {} ] 执行啦...", this.getClass().getSimpleName());
 
        chain.doFilter(request, response);
    }
 
    @Override
    public void destroy() {
        log.info("[ {} ] 被摧毁啦...", this.getClass().getSimpleName());
    }
}

4.3 @WebFilter作用总结

Tomcat 的 servlet 包下的注解,通过 @WebFilter 注解可以将指定类声明为过滤器。

@WebFilter 属性中没有配置顺序的,其执行顺序和 Filter 类名称字符排序有关,如果需要设置执行顺序,可以在命名的时候注意一下。

五、@Component注解实现过滤器

使用 @Component 将类声明为 Bean ,配合使用 @Order 注解可以设置过滤器执行顺序。

Java 复制代码
@Order(1)
@Component
public class WebVisitFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
       //初始化配置
    }

    /**
     * 输出访问
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        // 业务处理
    }

    @Override
    public void destroy() {
        //业务注销
    }
}

六、Java Config 配置类

使用 @Configuration + @Bean 配置类,注解声明Bean,交由 Spring 容器管理。

Java Config 的方式可以通过 @Bean 配置顺序或 FilterRegistrationBean.setOrder() 决定 Filter 执行顺序。

java 复制代码
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        // 业务处理
    }
    
    @Override
    public void destroy() {
    }
}



@Configuration
public class MyFilterConfig {

    /**
     * 注册 过滤器 Filter
     */
    @Bean
    public FilterRegistrationBean<Filter> webVisitFilterConfigRegistration() {
        //匹配拦截 URL
        String urlPatterns = "/admin/*,/system/*";
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<Filter>();
        registration.setDispatcherTypes(DispatcherType.REQUEST);
        registration.setFilter(new WebVisitFilter());
        registration.addUrlPatterns(StringUtils.split(urlPatterns, ","));
        //设置名称
        registration.setName("MyFilter");
        //设置过滤器链执行顺序
        registration.setOrder(3);
        //启动标识
        registration.setEnabled(true);
        //添加初始化参数
        registration.addInitParameter("enabel", "true");
        return registration;
    }
}

七、FilterChain 的作用

过滤器链是一种责任链模式的设计实现,在一个Filter 处理完成业务后,通过 FilterChain 调用过滤器链中的下一个过滤器。

流程如下:

  • FilterChain 接口定义了 doFilter 方法
java 复制代码
public interface FilterChain { 
    public void doFilter(ServletRequest request, ServletResponse response)
        throws IOException, ServletException;
}
  • ApplicationFilterChain类实现了 FilterChain 接口,管理所有的 Filter 的执行与调用
java 复制代码
public final class ApplicationFilterChain implements FilterChain {
    // 数组存储所有的过滤器链
    private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0];
    // 类中实现 doFilter() 方法 调用 调用 internalDoFilter(req,res) 方法
    public void doFilter(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {
        // ...
        //调用 internalDoFilter
        internalDoFilter(request,response);
    }
}
  • internalDoFilter(req,res) 方法中实现 Filter 调用的具体的操作
java 复制代码
//取得数组中下一个过滤器实例
ApplicationFilterConfig filterConfig = filters[pos++];
Filter filter = filterConfig.getFilter();
// ...
//调用下一个过滤器的 doFilter() 方法
filter.doFilter(request, response, this);

七、总结

创建过滤器有三种方法分别:

  1. @Component + @Order

  2. @WebFilter + ServlertComponentScan

  3. JavaConfig - FilterRegistrationBean

过滤器Filter作用场景 1).防止未登录就进入界面 2). 控制应用编码 3) . 过滤敏感词汇等场景

相关推荐
ChinaRainbowSea13 分钟前
十五,Spring Boot 整合连接数据库(详细配置)
java·数据库·spring boot·后端·spring·web
最菜的Bird16 分钟前
Apache Doris 实践
java·kafka·doris
菜到极致就是渣22 分钟前
Elasticsearch案例
java·elasticsearch·搜索引擎
张某布响丸辣23 分钟前
Spring Security 详解:保护Java应用的强大盾牌
java·后端·spring
我不会画饼鸭24 分钟前
springboot 控制器
java·spring boot·后端
杀死这个程序员25 分钟前
Spring MVC 启动与请求处理流程解析
java·spring·mvc·八股文
Lill_bin29 分钟前
SpringCloud解读
分布式·后端·spring·spring cloud·hystrix·架构
各位别卷了31 分钟前
springbootweb集成swagger
spring boot·后端
AitTech34 分钟前
在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求
后端·http·asp.net