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类似,那么他们是否可以互相替换呢?具体有哪些差别呢?后面会继续分析
|