我创建了一个弹簧启动过滤器 - 使用GenericFilterBean
注释实现@Component
。
@Component
public class MyAuthenticationFilter extends GenericFilterBean {
...
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
...
}
}
过滤器由Spring Boot Framework自动识别,适用于所有REST API。我希望此过滤器仅适用于某个网址路径,例如/api/secure/*
,但我无法找到正确的方法。
我试过了@WebFilter
,但它没有用。
我没有使用XML配置或servlet初始化程序 - 只是注释。
让它运作的正确方法是什么?
答案 0 :(得分:18)
您可以添加如下过滤器:
@Bean
public FilterRegistrationBean someFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(someFilter());
registration.addUrlPatterns("/url/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("someFilter");
registration.setOrder(1);
return registration;
}
@Bean(name = "someFilter")
public Filter someFilter() {
return new SomeFilter();
}
答案 1 :(得分:7)
如果您能够扩展OncePerRequestFilter
,则还有另一种选择。例如:
public class SomeFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// your filter logic ....
}
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
String path = request.getServletPath();
return !path.startsWith("/api/secure/");
}
}
答案 2 :(得分:2)
@ user1283002我认为可以使用@WebFilter。我只是偶然发现了这个article。根据文章(自己没有尝试过):
@WebFilter(urlPatterns = "/api/count")
public class ExampleFilter implements Filter{
// ..........
}
// and let Spring know to scan to find such @WebFilter annotation in your config
// class by using the @ServletComponentScan annotation like
@ServletComponentScan
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(MyApplication.class, args);
}
// ..........
}
编辑: 在进一步阅读 @ServletComponentScan 的文档之后,我遇到了一个有趣的免责声明
仅在使用嵌入式Web服务器时执行扫描
这意味着在将我们的应用程序部署到Web容器(例如Apache Tomcat)中时,Spring框架不会扫描此类,因此将不会应用其上的任何spring配置(如果有)。
如果没有要进行的Spring配置,那么最好不要进行任何进一步的更改,如果不这样做,只需将 @Component 扫描添加到过滤器中,并确保其软件包位于以下路径中您的 @ComponentScan 注释。