跳到主要内容

过滤器与拦截器

名词解释

过滤器: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 接口来完成。

SpringBoot - WebMvcConfigurer的作用是什么?_cloneme01的博客-CSDN博客