阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

添加Filter

22次阅读
没有评论

共计 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 {...}
}

这个 ApiFilterRegistrationBeanAuthFilterRegistrationBean又有所不同。因为我们要过滤 URL,而不是针对所有 URL 生效,因此,在 @PostConstruct 方法中,通过 setFilter() 设置一个 Filter 实例后,再调用 setUrlPatterns() 传入要过滤的 URL 列表。

练习

在 Spring Boot 中添加 Filter 并指定顺序。

下载练习

小结

在 Spring Boot 中添加 Filter 更加方便,并且支持对多个 Filter 进行排序。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1385字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中