Wie Sie angeben, Filter Ausführung, um mit Spring Java-Konfiguration?
Habe ich das folgende Stück code in meine Initialisierung:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Filter[] getServletFilters() {
DelegatingFilterProxy shiroFilter = new DelegatingFilterProxy("shiroFilter");
shiroFilter.setTargetFilterLifecycle(true);
return new Filter[]{new CorsFilter(),shiroFilter};
}
}
Möchte ich CorsFilter
ausgeführt werden, bevor ShiroFilter
. Aber die Spring-Dokumentation nicht sagen, dass die Reihenfolge, in der Filter ausgeführt werden, wird durch Ihre Reihenfolge im array zurückgegeben.
Wenn es ist, kann mir bitte jemand erläutern? Wenn nicht, kann jemand empfehlen, wie tun ich dafür, die Reihenfolge der Ausführung von Filter?
- Wo in deinem stack ist es ein
OncePerRequestFilter
? - was meinst du mit 'wo'? sein ein Teil des Frühlings
- Früher waren Sie reden über shiros
OncePerRequestFilter
. Welches ist es? - Lesen Sie die Kommentare unten voll. auch diese Kommentare gehört, dass die post selbst, nicht hier.
- Reihenfolge der Filter in einem
web.xml
- Datei wird ermittelt, ob es eine option für Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur um die Frage, up-to-date.
Mit der Feder @Um - Annotation
Filter sind eingetragen in der Reihenfolge der array.
Diese Ergebnisse in
ServletContext.addFilter()
aufgerufen wird, in der Reihenfolge der Elemente, jedoch, ich bin nicht sicher, ob dies tatsächlich Ergebnisse in der Filter ausgeführt wird, indem der Behälter in der Reihenfolge, in der Sie registriert wurden.Tomcat zum Beispiel scheint die Verwendung eine HashMap zu speichern Filter also ich würde nicht erwarten, dass Filter unbedingt laufen in der Reihenfolge in der Sie Hinzugefügt wurden.
Frühjahr eine
org.springframework.web.filter.CompositeFilter
, also ich würde einfach wieder einen einzelnenCompositeFilter
enthält zwei Filter, die Sie tatsächlich verwenden möchten.CompositeFilter
. Erstellen Sie eineDelegatingFilterProxy
hält, dass einCompositeFilter
zu der Sie passieren eineList
desFilter
Bohnen, die Sie registrieren möchten.CompositeFilter
funktioniert nicht mit beliebigen filter verwendet Apache Shiro istOncePerRequestFilter
seit seinerOncePerRequestFilter.doFilter()
Methode prüft ob die filter bereits ausgeführt wurde, mit Namen, und der name wird in diesem Fall 'compositeFilter' (anstelle der Ausführung filter) ein, wodurch dieOncePerRequestFilter
nie ausgeführt wird.OncePerRequestFilter
- Klasse gibt es sowohl Shiro und Spring, und mitCompositeFilter
bricht Sie beide. also definitiv keine Lösung.HashMap
ist ein Roter Hering: dieFilter
s sind registriert und ausgeführt, in die richtige Reihenfolge bei der Deklaration in XML, aber die Reihenfolge derFilter
s entdeckt und registriert über Annotationen gesteuert werden kann nicht. Für die, die Sie muss verwendenweb.xml
oder irgendeine Art von composite -Filter
.Jemanden, den Sie für verwenden möchten, können annotation javax statt Frühling,
@javax.annotation.Priority
annotation könnte auch verwendet werden, anstelle des @ - Bestellung, wie die Antwort von "dit" oben .