- 过滤器 Filter
- 实现 javax.servlet.Filter 接口
- 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁
- Filter的生命周期由WEB服务器负责
- 可以对请求的URL进行过滤, 对敏感词过滤
- 挡在拦截器的外层
- Filter 是 Servlet 规范的一部分
- 拦截器 Interceptor
- 实现 org.springframework.web.servlet.HandlerInterceptor 接口
- 不依赖Spring容器, 可以使用 Spring 容器管理的Bean
- 拦截器通过动态代理进行
- 拦截器应用场景, 性能分析, 权限检查, 日志记录
- 监听器 Listener
- 启动类添加注解 @ServletComponentScan 注解
- 使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册
- @WebFilter时Servlet3.0新增注解,原先实现过滤器,需要在web.xml中进行配置,而现在通过此注解,启动时会自动扫描自动注册
- 使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册
编写过滤器类实现 Filter 接口
- 类名上添加 @WebFilter 注解, // 指定过滤的URL
-
启动类
@SpringBootApplication
@ServletComponentScan // 扫描 Servlet 相关的组件
public class SpringBootFilterApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootFilterApplication.class, args);
}
}
过滤器类
@Order(1) // 指定过滤器的执行顺序
@WebFilter(filterName = "CostTimeFilter", urlPatterns = "/*" , initParams = {
@WebInitParam(name = "URL", value = "http://localhost:8080")}) // 指定过滤的URL
public class CostTimeFilter implements Filter {
private String url;
/**
* filter对象只会创建一次,init方法也只会执行一次。
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.url = filterConfig.getInitParameter("URL");
System.out.println("Filter init...");
}
/**
* 主要的业务代码编写方法
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
long start = System.currentTimeMillis();
System.out.println(start + " Filter doFilter before...");
filterChain.doFilter(servletRequest, servletResponse);
long end = System.currentTimeMillis();
System.out.println(end + "Filter doFilter after...");
}
/**
* 在销毁Filter时自动调用。
*/
@Override
public void destroy() {
System.out.println("Filter destroy...");
}
}
配置方式二:只能过滤所有路径
编写过滤器类实现 Filter 接口
- 类名上添加 @Component 或 @Configuration 接口(推荐使用@Component)
备注:如果添加了@Component 或 @Configuration,又添加了 @WebFilter(),那么会初始化两次Filter,并且会过滤所有路径+自己指定的路径 ,便会出现对没有指定的URL也会进行过滤
- 类名上添加 @Component 或 @Configuration 接口(推荐使用@Component)
配置方式三:可过滤指定路径
- 编写过滤器类实现 Filter 接口
编写过滤器注册类
- 类名上添加 @Configuration 注解
-
过滤器类
public class CostTimeFilter implements Filter {
private String url;
/**
* filter对象只会创建一次,init方法也只会执行一次。
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.url = filterConfig.getInitParameter("URL");
System.out.println("Filter init...");
}
/**
* 主要的业务代码编写方法
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest, servletResponse);
}
/**
* 在销毁Filter时自动调用。
*/
@Override
public void destroy() {
System.out.println("Filter destroy...");
}
}
注册过滤器
@Configuration
public class FilterConfig {
@Bean
// @Order(2)
public FilterRegistrationBean registFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new CostTimeFilter());
registration.addUrlPatterns("/*");
registration.setName("CostTimeFilter");
registration.setOrder(1);
return registration;
}
}