Spring Web項目都需要用到Filter來實現各種不同的能力,比如鑑權,限流,日誌等。 而且有的Filter實現還需要注入Spring其他bean,這樣就需要一些特殊的實現
AccessFilter
簡單地打印請求url
public class AccessFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
log.info("AccessFilter:doFilter - {}", ((HttpServletRequest)servletRequest).getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
}
}
1. Spring bean
比如使用@Component
註解
@Component
public class AccessFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
log.info("AccessFilter:doFilter - {}", ((HttpServletRequest)servletRequest).getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
}
}
Servlet掃描
使用註解@ServletComponentScan
和@WebFilter
,實際上就是生成一個類型是FilterRegistrationBean
,名字是accessFilter
的bean並作爲Filter生效.
@WebFilter
public class AccessFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
log.info("AccessFilter:doFilter - {}", ((HttpServletRequest)servletRequest).getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
}
}
- SpringSimpleWebApplication
@ServletComponentScan
@SpringBootApplication
public class SpringSimpleWebApplication {
public static void main(String[] args) {
SpringApplication.run(SpringSimpleWebApplication.class, args);
}
}
手工註冊: FilterRegistrationBean
會生成一個類型是FilterRegistrationBean
,名字是accessFilterRegister
的bean並作爲Filter生效.
@Bean
public FilterRegistrationBean<AccessFilter> accessFilterRegister(AccessFilter accessFilter) {
FilterRegistrationBean<AccessFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(accessFilter);
registration.addUrlPatterns(filterUrl);
registration.setName("accessFilter");
registration.setOrder(1);
return registration;
}
實踐
- 如果urlPatterns需要從配置文件加載: 那麼選擇
FilterRegistrationBean
- 如果既要動態加載urlPatterns,還要依賴spring其他的bean: 那麼生成bean的同時,再使用
FilterRegistrationBean
@Slf4j
@Configuration
public class WebConfiguration {
@Value("${urlPattens:/}")
private String urlPatterns;
@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
}
@Bean
public FilterRegistrationBean<AccessFilter> accessFilterRegister(AccessFilter accessFilter) {
FilterRegistrationBean<AccessFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(accessFilter);
registration.addUrlPatterns(urlPatterns);
registration.setOrder(1);
return registration;
}
}
- 同名的filter只會有一個生效