1. Filter简介

通过Filter技术,对各种资源:例如API, JSP,Servlet,静态图片文件或静态HTML文件进行拦截,从而实现一些特殊功能。如实现token校验,URL级别的权限控制、过滤敏感词汇、额外记录日志、压缩响应信息等一些高级功能。

1.1. SpringBoot 中Filter的作用

  • 在request被处理前,预处理,或者修改request。比如,所有的api都要做鉴权处理,通过后才会被业务逻辑处理,这部分逻辑就可以卸载Filter中。
  • 修改一个response,比如附加一些额外的信息再返回给Client。
  • 可以定义多个Filter,并指定执行的顺序。

1.2. @WebFilter

Servlet3+ 额外增加的WebFilter注释, 方便处理Web应用中的场景。

2. 基于@WebFilter的实现

环境:

  • Java 1.8.0_05
  • Spring Boot: 2.4.1
  • IDE: Intellj IDEA 2020.3

2.1. SpringbootApplication方法上加上启动扫描

@ServletComponentScan
@SpringBootApplication
public class TodoApiApplication {
    // ... ...
}

2.2. 新建Filter

@WebFilter(filterName = "AuthFilter", urlPatterns = {"/todo-api/v1/tasks/*", "/todo-api/v1/order/*"})
@Order(1)
public class AuthFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        // 预处理 Request
        // "Request - "+ request.getMethod() + ":"+ request.getRequestURI()
        // ... ...

        // 最后,让其他servlet或者Filter继续处理
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

2.3. 关于WebFilter

  1. Order(x) 里面的x数值越小优先级越高
  2. 根据需要,可以重载init,destroy方法
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器创建");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }

3. 总结

Filter (@WebFilter) 用于拦截Web请求,进行预处理,或者修改Response再返回给客户端。

———- END ———-

版权声明:本文为skywind原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/skywind/p/spring-boot-filter-webfilter.html