web-dev-qa-db-ja.com

URLパターンに基づいてスプリングブートフィルターを適用する方法

スプリングブートフィルターを作成しました-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/*などの特定のURLパスにのみ適用します正しい方法が見つかりません@WebFilterを試しましたが、機能しませんでしたXML構成またはサーブレット初期化子を使用していません-注釈だけです。

それを機能させる正しい方法は何でしょうか?

14
user1283002

次のようなフィルターを追加できます。

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

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/");
    }
}
13
vegemite4me

@ user1283002 @WebFilterを使用して実行できると思います。私はこれにつまずいた 記事 。記事ごとに(自分で試したことはありません):

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

   // ..........

}

EDIT:@ ServletComponentScanのドキュメントをさらに読んだ後、興味深い免責事項に遭遇しました

組み込みWebサーバーを使用している場合のみスキャンが実行されます

つまり、アプリケーションをWebコンテナ(Apache Tomcatなど)にデプロイする場合、このクラスはSpringフレームワークによってスキャンされないため、Springの設定(存在する場合)は適用されません。

Spring configが作成されていない場合は、変更せずにそのまま進んでください。@ Componentスキャンをフィルターに追加して、パッケージがパッケージ内にあることを確認しないでください。 @ ComponentScanアノテーションのパス。

3
artemisian