2016-07-07 11 views
1

単純なカスタムCorsフィルタを(最初の位置に)スプリングフィルタチェーン内に挿入しようとしています。SpringBoot注釈のないフィルタの順序を設定する方法

私はこの

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
public class CorsFilter implements Filter { 

のようにそれを行う場合、それは私があれば私は思っていた春のServletHandler.javaどこそこのライン

chain=getFilterChain(baseRequest, target, servlet_holder); 

にブレークポイントを置くことによって、それを確認することができ、完全 の作品ではなく@Componenent and @Orderを使用し、その代わりにフィルタBeanをアプリケーションコンテキストとして定義します。 フィルタの順序はどのように設定できますか?

+1

'@ Component'を使うことは、それをBeanとして定義しています。しかし、必要ならば、ファイラーの '' @ Bean'メソッドを作成し、 'FilterRegistrationBean'を追加し、' order'プロパティを設定してください。 –

+0

うん、それはありがとう! – Johny19

答えて

4

例を参照してください: をあなたのクラスServletInitializerで:クラスフィルターで@Componentアノテーションを使用しないでください。私のフィルタの名前は "requestLogFilter"

警告

@Bean 
public FilterRegistrationBean requestLogFilter() { 
     final FilterRegistrationBean reg = new FilterRegistrationBean(createRequestLogFilter()); 
     reg.addUrlPatterns("/*"); 
     reg.setOrder(1); //defines filter execution order 
     return reg; 
} 

@Bean 
public RequestLogFilter createRequestLogFilter(){ 
     return new RequestLogFilter(); 
} 

です。

+0

私の問題を解決しました。共有ありがとう! –

3

corsFilterの場合、springSecurityFilterChainの前にロードするフィルタの順序を設定し、springブートからerrorPageFilterなどの他のフィルタをチェーンの先頭にラーディングする必要があります。さもなければCORSのサポートは壊れ、必要なヘッダーは導入されません。これは、下記事項に達成することができます。

@Configuration 
public class MyConfiguration { 

    @Bean 
    public FilterRegistrationBean corsFilter() { 
     UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
     CorsConfiguration config = new CorsConfiguration(); 
     config.setAllowCredentials(true); 
     config.addAllowedOrigin("http://domain1.com"); 
     config.addAllowedHeader("*"); 
     config.addAllowedMethod("*"); 
     source.registerCorsConfiguration("/**", config); 
     FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); 
     bean.setOrder(Integer.MIN_VALUE); 
     return bean; 
    } 
} 

bean.setOrder(はInteger.MIN_VALUE)それがロードされた非常に最初のフィルタであることを確認します。たとえ、Integer.MIN_VALUE(-2147483648)に設定されたorderを持つerrorPageフィルタのような他のフィルタがあっても。

+0

あなたのソリューションはうまく動作します。しかし、私はなぜそれを理解していない。私はこれがCorsFilterのバグか欠点だと思う。 – chenatu

+0

これはバグだとは思いませんが、これが使用されている唯一のフィルターになる場合は、順序を設定しなくても問題ありません。ただし、スプリングセキュリティなどの他のフィルタを使用している場合は、チェーンの順番に正しい順序を設定する必要があります。 – megalucio

関連する問題