- 过滤器 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")}) // 指定过滤的URLpublic class CostTimeFilter implements Filter {private String url;/*** filter对象只会创建一次,init方法也只会执行一次。*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.url = filterConfig.getInitParameter("URL");System.out.println("Filter init...");}/*** 主要的业务代码编写方法*/@Overridepublic 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时自动调用。*/@Overridepublic 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方法也只会执行一次。*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.url = filterConfig.getInitParameter("URL");System.out.println("Filter init...");}/*** 主要的业务代码编写方法*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {filterChain.doFilter(servletRequest, servletResponse);}/*** 在销毁Filter时自动调用。*/@Overridepublic void destroy() {System.out.println("Filter destroy...");}}
注册过滤器
@Configurationpublic 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;}}
