Bootstrap

Filter简述和@Filter注解使用

Filter主要用于对用户请求进行预处理,也可以对请求的响应结果进行后续处理。它与Servlet的区别在于,不能直接向用户生成响应结果。

Filter的执行流程

用户发送请求,Filter首先拦截用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应结果进行后续处理。

Filter主要功能

(1)根据需要可以检查并修改HttpServletRequest请求头和请求数据。

(2)根据需要可以检查并修改HttpServletResponse响应头和响应数据。

Filter实际应用场景

(1)权限过滤:Filter负责对请求进行权限检查,过滤非法请求。

(2)日志记录:对某些特殊操作进行日志记录。

(3)设置字符集。

Filter注入方式

servlet3.0前,Filter的注入通常采用xml方式注入,但是在servlet3.0后,开始支持通过注解的方式进行注入。

(1)基于注解@Filter注入

采用@Filter注入时,需要通过注解@ServletComponentScan配置扫描路径,如果是SpringBoot项目,通常添加到启动类上。

/**
 * 配置请求拦截路径
 */
@WebFilter(urlPatterns = {"/user/*"})
@Log4j2
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        log.info("Filter获取到请求地址:" + httpServletRequest.getServletPath());
        filterChain.doFilter(request, response);

        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        log.info("Filter获取到响应类型:" + httpServletResponse.getContentType());
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter随着项目的启动而启动,只初始化一次");
    }

    @Override
    public void destroy() {
        System.out.println("Filter随着web项目的停止而销毁,完成资源回收");
    }
}

(2)通过配置类进行注入

@Configuration
public class MyRegistrationConfig {
    @Bean
    public FilterRegistrationBean myFilter(){
        MyFilter myFilter = new MyFilter();
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/user/*"));
        return filterRegistrationBean;
    }
}

结束语

过滤器Filter的功能看起来和拦截器Interceptor类似,那么他们是否可以互相替换呢?具体有哪些差别呢?后面会继续分析

;