过滤器与拦截器
名词解释
过滤器:servlet规范的一部分,依赖于servlet容器,一般由servlet容器进行回调执行。
拦截器:spring技术栈,使用spring即可使用,依赖spring容器,由spring容器回调执行。
过滤器
springboot中怎么使用过滤器
-
方法一:使用FilterRegistrationBean编程式注册
一个实现了Filter接口的过滤器实现类
通过一个@Configuration注解的类,声明一个@Bean,通过构造FilterRegistrationBean实现,指定过滤器实例、名称、顺序、urlpattern等,类似以前通过web.xml来配置。
public class LogCostFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
long start = System.currentTimeMillis();
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("Execute cost="+(System.currentTimeMillis()-start));
}
@Override
public void destroy() {
}
}
```java
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean logCostFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new LogCostFilter());
registration.addUrlPatterns("/*");
registration.setName("LogCostFilter");
registration.setOrder(1);
return registration;
}
}
- **方法二:使用WebFilter注解**
一个实现了Filter接口的过滤器实现类,使用@WebFilter注解(*servlet规范提供*),来指定urlPattern,过滤器名等属性
springboot的配置类中,增加一个注解 @ServletComponentScan(*spring提供*),指定扫描的包
```java
@WebFilter(urlPatterns = "/*", filterName = "logFilter2")
public class LogCostFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
long start = System.currentTimeMillis();
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("LogFilter2 Execute cost=" + (System.currentTimeMillis() - start));
}
@Override
public void destroy() {
}
}
@SpringBootApplication
@MapperScan("com.pandy.blog.dao")
@ServletComponentScan("com.pandy.blog.filters")
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
注意
1.方式二的过滤器,无法指定顺序,通过Filter实现类的名字顺序执行
2.方式二实现的过滤器,优先级高于方式一
拦截器
拦截器,实现HandlerInterceptor,按需实现方案
配置类,一个实现WebMvcConfigurer的配置类,实现addInterceptors方法,指定拦截器要拦截的url
@Service
public class ServerTimingHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.addHeader(ServerTimingConstants.SERVER_START_TIME,
Long.valueOf(System.currentTimeMillis()).toString());
return true;
}
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Resource
private ServerTimingHandlerInterceptor serverTimingHandlerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(serverTimingHandlerInterceptor).addPathPatterns("/api/**").excludePathPatterns("/api/kim/**");
}
@Override
public void addFormatters(FormatterRegistry registry) {
registry.removeConvertible(String.class, Collection.class);
}
}
WebMvcConfigurer是什么
一个接口,用于配置全局的SpringMVC的相关属性,采用JAVABEAN的方式来代替传统的XML配置文件,提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。
WebMvcConfigurer 在 Spring Boot 2.x 中官方建议使用该接口来实现自定义配置。所以,Spring Boot 2.x 中,自定义 SpringMVC 配置可以通过实现 WebMvcConfigurer 接口来完成。