Filter zweimal mit Spring Bean Annotation registriert
Bei der Registrierung eines Filters als Spring Bean ist es wichtig, die Möglichkeit mehrerer Aufrufe zu berücksichtigen . In bestimmten Szenarien kann der Filter zweimal ausgelöst werden, wie im folgenden Problem beobachtet:
Problem:
Ein Benutzer definiert einen Filter, A, der Springs GenericFilterBean erweitert . Wenn dieser Filter als Bean in der Spring Security-Konfiguration registriert wird, wird ein zusätzlicher Aufruf beobachtet, der zu der folgenden Ausgabe führt:
filter A before filter A before mycontroller invoke filter A after filter A after
Abfrage:
Warum Wird der Filter zweimal aufgerufen und wie kann dieses Problem sein? gelöst?
Antwort:
Der zusätzliche Aufruf erfolgt, weil Spring Boot automatisch jede Bean vom Typ Filter beim Servlet-Container registriert. Um dies zu verhindern, gibt es zwei Möglichkeiten:
Option 1: Filter nur bei Spring Security registrieren
Vermeiden Sie die Offenlegung des Filters als Bean und registrieren Sie ihn ausschließlich bei Spring Security , wie folgt:
@Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.addFilterBefore(new A(), BasicAuthenticationFilter.class); http.csrf().disable(); }
Option 2: Verwenden Sie FilterRegistrationBean mit Anmerkung
Wenn eine automatische Verknüpfung von Abhängigkeiten mit dem Filter erforderlich ist, kann man ihn als Bean registrieren, aber seine automatische Registrierung beim Servlet-Container mithilfe einer FilterRegistrationBean deaktivieren:
@Bean public FilterRegistrationBean registration(MyFilter filter) { FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<MyFilter>(filter); registration.setEnabled(false); return registration; }
Das obige ist der detaillierte Inhalt vonWarum wird mein Spring-Filter zweimal aufgerufen und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!