https://www.jianshu.com/p/ba4ee395dce0
两种配置方法
第一种
1.在Filter类上加@WebFilter;
- Springboot入口Class上加@ServletComponentScan(basePackages = {"filter所在包名"})
多个Filter都这样配置,只要这些Filter之间没有先后依赖关系。
我这里刚好有两个Filter有先后顺序要求,看到除了@WebFilter注解还有@Order这个注解。
Springboot官方文档没有细说这个Order注解。经测试程序在本地是好的,部署到远程顺序就不能保证了。没有深纠是什么原因,知道还有第二种配置方法。
第二种方式
这种配置能保证Filter的执行先后顺序
在启动类添加FilterRegistrationBean,如下
@SpringBootApplication
public class DovApplication {
public static void main(String[] args) {
SpringApplication.run(DovApplication.class, args);
}
//第一个Filter注册
...
@Bean
public FilterRegistrationBean<RequireLoginFilter> registerLoginCheckFilter(RequireLoginFilter requireLoginFilter) {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(requireLoginFilter);
registrationBean.addUrlPatterns("/*");
registrationBean.setName("loginCheckFilter");
registrationBean.setOrder(2);
return registrationBean;
}
}
@Component
public class RequireLoginFilter extends OncePerRequestFilter {
private static List<String> loginNotRequiredUrls = new ArrayList<>();
static {
loginNotRequiredUrls.add("/images/**");
loginNotRequiredUrls.add("/");
loginNotRequiredUrls.add("/login");
}
@Autowired
private SessionCache sessionCache;
private PathMatcher pathMatcher = new AntPathMatcher();
... //省略
RequireLoginFilter用普通的@Component标记,它本身用到的依赖autowire进去即可。
经测试第二种配置Filter的Order是能保证的,order值越小,Filter越早经过。
0人点赞
作者:持证程序员
链接:https://www.jianshu.com/p/ba4ee395dce0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。