2016-07-07 3 views
1

Ich versuche, einen einfachen benutzerdefinierten Cors-Filter in die Federfilterkette einzufügen (in der ersten Position).SpringBoot wie man die Reihenfolge des Filters ohne Annotation einstellt

Wenn ich es tun wie dieses

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

es funktioniert perfekt ich es, indem Sie einen Haltepunkt in Spring ServletHandler.java überprüfen können, wo die Linie

chain=getFilterChain(baseRequest, target, servlet_holder); 

ich gerade gefragt, ob Ich wünsche nicht@Componenent and @Order zu verwenden und stattdessen den Filter Bean den Anwendungskontext zu definieren. Wie kann ich die Reihenfolge der Filter einstellen?

+1

Mit '@ Component' wird es als Bean definiert. Aber wenn Sie müssen, erstellen Sie eine '' Bean'-Methode für den Filer und fügen Sie auch eine 'FilterRegistrationBean' hinzu und legen Sie ihre 'Order'-Eigenschaft fest. –

+0

yep das ist es danke! – Johny19

Antwort

4

Siehe Beispiel: In Ihrer Klasse ServletInitializer:

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

der Namen meines Filters "requestLogFilter"

Warnung: Nicht @Component Anmerkung an den Klasse-Filter verwenden.

+0

Mein Problem wurde gelöst. Danke für das Teilen! –

3

Bei corsFilter ist es normalerweise erforderlich, die Reihenfolge dieses Filters so einzustellen, dass er vor springSecurityFilterChain und anderen Filtern wie errorPageFilter vom Springboot geladen wird, um am Anfang der Kette geladen zu werden. Andernfalls wird die CORS-Unterstützung unterbrochen und die erforderlichen Header werden nicht eingeführt. Dies kann in folgenden Materie erreicht werden:

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

Die bean.setOrder (Integer.MIN_VALUE) wird sicherstellen, dass ist der erste Filter geladen. Auch wenn andere Filter vorhanden sind, z. B. errorPage-Filter mit der Reihenfolge integer.MIN_VALUE (-2147483648).

+0

Ihre Lösung funktioniert gut für mich. Aber ich verstehe nicht warum. Ich denke, das ist ein Fehler oder ein Nachteil für CorsFilter. – chenatu

+0

Ich würde nicht denken, dass dies ein Fehler ist, ich bin sicher, es wird gut funktionieren, ohne die Reihenfolge in dem Fall, wo dies der einzige Filter sein wird, zu setzen. Wenn Sie jedoch andere Filter verwenden, z. B. mit Federsicherheit, müssen Sie die Reihenfolge in der Reihenfolge der Kette in der richtigen Reihenfolge einrichten. – megalucio

Verwandte Themen