过滤器是 Java Servlet 规范中定义的,它能够在请求传送给 Servlet 之前,对 ServletRequest 和 ServletResponse 做检查和修改,起到了过滤的作用。
SpringBoot 中实现过滤器
Spring Boot 中的过滤器是基于 Servlet 过滤器。第一步,定义过滤器的类,该类必须继承 Filter 接口。
自定义过滤器
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
System.out.println("MyFilter: "+ req.getRequestURI());
chain.doFilter(request, response);//这步使得请求能够继续传导下去,如果没有的话,请求就在此结束
}
@Override
public void destroy() {
}
}
第二步,注册过滤器,这步骤有 3 种方法。
方法 1. 在配置类中实现一个 FilterRegistrationBean 对象。
配置类实现方式
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean<MyFilter> abcFilter() {
FilterRegistrationBean<MyFilter> filterRegBean = new FilterRegistrationBean<>();
filterRegBean.setFilter(new MyFilter());
filterRegBean.addUrlPatterns("/api/*");
filterRegBean.setOrder(Ordered.LOWEST_PRECEDENCE -1);
return filterRegBean;
}
}
方法 2. 使用@Component 和@Order 注解注册。
使用@Component
@Order(Ordered.LOWEST_PRECEDENCE -1)
@Component
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
System.out.println("MyFilter: "+ req.getRequestURI());
chain.doFilter(request, response);//这步使得请求能够继续传导下去,如果没有的话,请求就在此结束
}
@Override
public void destroy() {
}
}
这种方法的缺点是不能再指定 UrlPatterns,默认的 URL 模式就是/*
方法 3. 使用@WebFilter 和@ServletComponentScan 注解,@WebFilter 注解是 Servlet3.0 中的注解,SpringBoot 能够支持该注解,通过@ServletComponentScan 注解,能够扫描并注册到 Servlet 容器中。
@WebFilter方式
@WebFilter(urlPatterns="/api/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
System.out.println("MyFilter: "+ req.getRequestURI());
chain.doFilter(request, response);//这步使得请求能够继续传导下去,如果没有的话,请求就在此结束
}
@Override
public void destroy() {
}
}
还需要@ServletComponentScan 注解
@ServletComponentScan
@SpringBootApplication
public class SpringbootlearnApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootlearnApplication.class, args);
}
}
@WebFilter 方式,可以支持 UrlPatterns 的设置,但是不支持 Order 的设置。
综上所述,第 1 种方法是最灵活的,也是最常用的一种。
参考:https://www.concretepage.com/spring-boot/spring-boot-filter