如何应用基于 URL 模式的 spring boot 过滤器?

新手上路,请多包涵

我创建了一个 spring boot 过滤器 - 实现 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。我希望此过滤器仅应用于特定的 URL 路径,例如 /api/secure/* 但我找不到正确的方法。我尝试了 @WebFilter 但它没有用。我没有使用 XML 配置或 servlet 初始值设定项 - 只是注释。

让它工作的正确方法是什么?

原文由 user1283002 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 391
2 个回答

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

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

原文由 Ulises 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您能够扩展 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/");
    }
}

原文由 vegemite4me 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题