SpringBoot Filter 过滤器

 


SpringBoot Filter 过滤器

在项目中想拦截用户的请求并执行对应的操作,Interceptor 只能拦截 Controller 层级的请求,而 Filter 则几乎能过滤所有的请求。

1、介绍

Filter 是 JavaEE 中 Servlet 规范的一个组件, 通过 Filter 技术,可以实现用户访问某个资源前,对访问的请求和响应进行过滤。

Filter

2、Filter 与 Interceptor 的区别

  1. 拦截器是基于 java 的反射机制,使用代理模式,而过滤器是基于函数回调。
  2. 拦截器不依赖 servlet 容器,过滤器依赖于 servlet 容器。
  3. 拦截器只能对 action 起作用,而过滤器可以对几乎所有的请求起作用(可以保护资源)。
  4. 拦截器可以访问 action 上下文,堆栈里面的对象,而过滤器不可以。

3、@Bean配置方式

3.1、自定义 filter 类实现 Filter 接口

复制import java.io.IOException;
public class AccessFilter implements Filter {
    Logger logger = LoggerFactory.getLogger(AccessFilter.class);

    //@Autowired失效,因为AccessFilter是new出来的
    private IUserService userService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //获取ServletContext
        ServletContext context = filterConfig.getServletContext();
        //获取WebApplicationContext上下文
        WebApplicationContext cxt = WebApplicationContextUtils.getWebApplicationContext(context);
        //完成对象注入
        userService = (IUserService)cxt.getBean(IUserService.class);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String requestUrl = request.getRequestURI();

        logger.info("requestUrl:" + requestUrl);
        System.out.println("=========" + userService.findById(1L).toString());
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
    }
}
  • void init(FilterConfig config):用于完成Filter的初始化。
  • void destory():用于Filter销毁前,完成某些资源的回收。
  • void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain): 实现过滤功能,即对每个请求及响应增加的额外的预处理和后处理。如果在doFilter中忘记调用 chain.doFilter() 方法,则用户的请求将得不到处理。

3.2、添加配置类

@Configuration
public class Config {
    @Bean
    public FilterRegistrationBean registrationBean() {
        //创建Filter
        AccessFilter filter = new AccessFilter();
        FilterRegistrationBean registration = new FilterRegistrationBean();
        //注册
        registration.setFilter(filter);
        //过滤所有请求
        registration.addUrlPatterns("/*");
        registration.setName("AccessFilter");
        //过滤器顺序,值越小,优先级越高
        registration.setOrder(1);
        return registration;
    }
}

如果不想添加配置类,则需要在自定义 fliter 类添加 @Component 注解进行注册。

4、@WebFilter 注解方式

4.1、自定义 filter 并添加 @WebFilter 注解

@WebFilter(filterName = "AccessFilter", urlPatterns = "/*")
@Order(1)
public class AccessFilter implements Filter {
    Logger logger = LoggerFactory.getLogger(AccessFilter.class);

    //@Autowired失效,因为AccessFilter是new出来的
    private IUserService userService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //获取ServletContext
        ServletContext context = filterConfig.getServletContext();
        //获取ebApplicationContext上下文
        WebApplicationContext cxt = WebApplicationContextUtils.getWebApplicationContext(context);
        //完成对象注入
        userService = (IUserService)cxt.getBean(IUserService.class);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String requestUrl = request.getRequestURI();

        logger.info("requestUrl:" + requestUrl);
        System.out.println("=========" + userService.findById(1L).toString());
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
    }
}

@WebFilter 参数列表如下:

Snipaste_2021-04-12_16-55-20

4.2 启动类添加 @ServletComponentScan 注解:

@MapperScan({"com.lin.mapper"})
@SpringBootApplication
@ServletComponentScan
public class MybatisPlusApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}

参考资料1:SpringBoot之Filter

参考资料2:在Spring的过滤器中注入实体类

posted @   MyDistance  阅读(706)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示

目录导航

SpringBoot Filter 过滤器
1、介绍
2、Filter 与 Interceptor 的区别
3、@Bean配置方式
3.1、自定义 filter 类实现 Filter 接口
3.2、添加配置类
4、@WebFilter 注解方式
4.1、自定义 filter 并添加 @WebFilter 注解
4.2 启动类添加 @ServletComponentScan 注解: