共计 1385 个字符,预计需要花费 4 分钟才能阅读完成。
我们在 Spring 中已经学过了集成 Filter,本质上就是通过代理,把 Spring 管理的 Bean 注册到 Servlet 容器中,不过步骤比较繁琐,需要配置web.xml
。
在 Spring Boot 中,添加一个 Filter
更简单了,可以做到零配置。我们来看看在 Spring Boot 中如何添加Filter
。
Spring Boot 会自动扫描所有的 FilterRegistrationBean
类型的 Bean,然后,将它们返回的 Filter
自动注册到 Servlet 容器中,无需任何配置。
我们还是以 AuthFilter
为例,首先编写一个AuthFilterRegistrationBean
,它继承自FilterRegistrationBean
:
@Component
public class AuthFilterRegistrationBean extends FilterRegistrationBean<Filter> {@Autowired
UserService userService;
@Override
public Filter getFilter() {setOrder(10);
return new AuthFilter();}
class AuthFilter implements Filter {...}
}
FilterRegistrationBean
本身不是 Filter
,它实际上是Filter
的工厂。Spring Boot 会调用 getFilter()
,把返回的Filter
注册到 Servlet 容器中。因为我们可以在 FilterRegistrationBean
中注入需要的资源,然后,在返回的 AuthFilter
中,这个内部类可以引用外部类的所有字段,自然也包括注入的UserService
,所以,整个过程完全基于 Spring 的 IoC 容器完成。
再注意到 AuthFilterRegistrationBean
使用了 setOrder(10)
,因为 Spring Boot 支持给多个Filter
排序,数字小的在前面,所以,多个 Filter
的顺序是可以固定的。
我们再编写一个 ApiFilter
,专门过滤/api/*
这样的 URL。首先编写一个ApiFilterRegistrationBean
@Component
public class ApiFilterRegistrationBean extends FilterRegistrationBean<Filter> {@PostConstruct
public void init() {setOrder(20);
setFilter(new ApiFilter());
setUrlPatterns(List.of("/api/*"));
}
class ApiFilter implements Filter {...}
}
这个 ApiFilterRegistrationBean
和AuthFilterRegistrationBean
又有所不同。因为我们要过滤 URL,而不是针对所有 URL 生效,因此,在 @PostConstruct
方法中,通过 setFilter()
设置一个 Filter
实例后,再调用 setUrlPatterns()
传入要过滤的 URL 列表。
练习
在 Spring Boot 中添加 Filter 并指定顺序。
下载练习
小结
在 Spring Boot 中添加 Filter
更加方便,并且支持对多个 Filter
进行排序。