【Spring Boot系列】-Spring Boot过滤器Filter
文章目录
一、概述
Filter(过滤器)可以理解为经过一层次的过滤处理才达到使用的要求,而其实Filter(过滤器)就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Filter(过滤器)主要用于对浏览器的请求进行过滤处理,将过滤后的请求再转给下一个资源。
Filter(过滤器)是一个小型web组件,它们通过拦截请求和响应,以便查看、提取或以某种方式操作客户端和服务器之间交换的数据,实现“过滤”的功能。Filter通常封装了一些功能的web组件,过滤器提供了一种面向对象的模块化机制,将任务封装到一个可插入的组件中, Filter组件通过配置文件来声明,并动态的代理。
二、Filter(过滤器)数据流程
- 接收用户请求,处理用户请求
- Filter:拦截用户请求
- Listener:监听器
三、Spring Boot 过滤器生命周期
使用过滤器很简单,只需要实现Filter类,然后重写它的3个方法即可。
- init方法:程序启动调用Filter的init()方法(永远只调用一次);在容器中创建当前过滤器的时候自动调用这个方法。
- destory方法:程序停止调用Filter的destroy()方法(永远只调用一次);在容器中销毁当前过滤器的时候自动调用这个方法。
- doFilter方法:doFilter()方法每次的访问请求如果符合拦截条件都会调用(程序第一次运行,会在servlet调用init()方法以后调用;不管第几次,都在调用doGet(),doPost()方法之前)。这个方法有3个参数,分别是ServletRequest、ServletResponse和FilterChain可以从参数中获取HttpServletReguest和HttpServletResponse对象进行相应的处理操作。
四、使用注解方式实现过滤器(@WebFilter)
4.1. 在springboot 启动类添加该注解@ServletComponentScan
@SpringBootApplication@ServletComponentScan// 过滤器publicclassSpringbootFilterApplication{SpringApplication.run(SpringbootFilterApplication.class, args);}
4.2. 写个过滤器类,实现Filter接口
@Component@WebFilter(urlPatterns ="/filter/*", filterName ="myTestFilter")@Slf4publicclassMyTestFilterimplementsFilter{@Overridepublicvoidinit(FilterConfig filterConfig)throwsServletException{
log.info("[ {} ] 创建啦...",this.getClass().getSimpleName());}@OverridepublicvoiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throwsIOException,ServletException{
log.info("[ {} ] 执行啦...",this.getClass().getSimpleName());
chain.doFilter(request, response);}@Overridepublicvoiddestroy(){
log.info("[ {} ] 被摧毁啦...",this.getClass().getSimpleName());}}
4.3 @WebFilter作用总结
Tomcat 的 servlet 包下的注解,通过 @WebFilter 注解可以将指定类声明为过滤器。
@WebFilter 属性中没有配置顺序的,其执行顺序和 Filter 类名称字符排序有关,如果需要设置执行顺序,可以在命名的时候注意一下。
五、@Component注解实现过滤器
使用 @Component 将类声明为 Bean ,配合使用 @Order 注解可以设置过滤器执行顺序。
@Order(1)
@Component
public class WebVisitFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化配置
}
/**
* 输出访问
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
// 业务处理
}
@Override
public void destroy() {
//业务注销
}
}
六、Java Config 配置类
使用 @Configuration + @Bean 配置类,注解声明Bean,交由 Spring 容器管理。
Java Config 的方式可以通过 @Bean 配置顺序或 FilterRegistrationBean.setOrder() 决定 Filter 执行顺序。
publicclassMyFilterimplementsFilter{@Overridepublicvoidinit(FilterConfig filterConfig)throwsServletException{}@OverridepublicvoiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throwsServletException,IOException{// 业务处理}@Overridepublicvoiddestroy(){}}@ConfigurationpublicclassMyFilterConfig{/**
* 注册 过滤器 Filter
*/@BeanpublicFilterRegistrationBean<Filter>webVisitFilterConfigRegistration(){//匹配拦截 URLString urlPatterns ="/admin/*,/system/*";FilterRegistrationBean<Filter> registration =newFilterRegistrationBean<Filter>();
registration.setDispatcherTypes(DispatcherType.REQUEST);
registration.setFilter(newWebVisitFilter());
registration.addUrlPatterns(StringUtils.split(urlPatterns,","));//设置名称
registration.setName("MyFilter");//设置过滤器链执行顺序
registration.setOrder(3);//启动标识
registration.setEnabled(true);//添加初始化参数
registration.addInitParameter("enabel","true");return registration;}}
七、FilterChain 的作用
过滤器链是一种责任链模式的设计实现,在一个Filter 处理完成业务后,通过 FilterChain 调用过滤器链中的下一个过滤器。
流程如下:
- FilterChain 接口定义了 doFilter 方法
publicinterfaceFilterChain{publicvoiddoFilter(ServletRequest request,ServletResponse response)throwsIOException,ServletException;}
- ApplicationFilterChain类实现了 FilterChain 接口,管理所有的 Filter 的执行与调用
publicfinalclassApplicationFilterChainimplementsFilterChain{// 数组存储所有的过滤器链privateApplicationFilterConfig[] filters =newApplicationFilterConfig[0];// 类中实现 doFilter() 方法 调用 调用 internalDoFilter(req,res) 方法publicvoiddoFilter(ServletRequest request,ServletResponse response)throwsIOException,ServletException{// ...//调用 internalDoFilterinternalDoFilter(request,response);}}
- internalDoFilter(req,res) 方法中实现 Filter 调用的具体的操作
//取得数组中下一个过滤器实例ApplicationFilterConfig filterConfig = filters[pos++];Filter filter = filterConfig.getFilter();// ...//调用下一个过滤器的 doFilter() 方法
filter.doFilter(request, response,this);
七、总结
创建过滤器有三种方法分别:
- @Component + @Order
- @WebFilter + ServlertComponentScan
- JavaConfig - FilterRegistrationBean
过滤器Filter作用场景 1).防止未登录就进入界面 2). 控制应用编码 3) . 过滤敏感词汇等场景
版权归原作者 goyeer 所有, 如有侵权,请联系我们删除。