Spring - Filter三種定義方式

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只會有一個生效
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章