如何申请基于URL模式春天开机过滤器?

问题描述 投票:10回答:3

我创建了一个弹簧引导过滤器 - 与GenericFilterBean注释实现@Component

@Component 
public class MyAuthenticationFilter  extends GenericFilterBean {
...
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
...
}
}

该过滤器是由Spring框架开机自动识别,并为所有的REST API的正常工作。我想这个过滤器只适用于某个URL路径,如/api/secure/*,但我无法找到正确的方式。我试图@WebFilter,但没有奏效。我不使用XML配置或Servlet初始化 - 只是注释。

什么是正确的方法来得到它的工作?

java spring filter spring-boot annotations
3个回答
21
投票

您可以添加这样的过滤器:

@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();
}

13
投票

还有另一种选择,如果你能延长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/");
    }
}

3
投票

@ 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注释的路径。

© www.soinside.com 2019 - 2024. All rights reserved.