Spring-Ausnahmehandler, der bestimmte Ausnahmetypen nicht behandelt

8

ive habe in meiner Spring 2.5 App einen einfachen Ausnahme-Handler eingerichtet. Derzeit fängt es alle Exception s ab und zeigt eine Stacktrace-Seite.

Dies ist gut und gut, aber jetzt Frühling Frühling Sicherheit nicht ordnungsgemäß kickt den nicht angemeldeten Benutzer auf die Anmeldeseite, stattdessen meine Ausnahme Seite wird mit der Feder Sicherheit Ausnahme gezeigt:

%Vor%

Das Problem ist, dass diese Anwendung keine eigene Exception-Unterklasse hat, die sie für alle ihre Exceptions verwendet, also muss ich Exception zuordnen, aber unmac AccessDeniedException

ist das im Frühling 2.5 möglich?

bearbeiten : mit Federsicherheit 2.0.1

meine Bohne sieht so aus

%Vor%     
mkoryak 23.02.2011, 17:23
quelle

5 Antworten

4

Die Art und Weise, wie wir damit umgehen, ist eine benutzerdefinierte Exception Resolver-Klasse, die alle Exceptions behandelt, die nicht von anderen Handlern abgefangen werden - sie implementiert HandlerExceptionResolver, Ordered.

Wir deklarieren eine separate SimpleMappingExceptionResolver-Bean, die bestimmte Ausnahmen abfängt.

Die Reihenfolge ist so, dass unser benutzerdefinierter Resolver nach dem SimpleMappingExceptionResolver ausgeführt wird.

Dies hat zur Folge, dass bestimmte Ausnahmen (z. B. AccessDeniedException) von SimpleMappingExceptionResolver verarbeitet und an die entsprechenden Seiten weitergeleitet werden.

Alle anderen Laufzeitausnahmen werden vom benutzerdefinierten Resolver behandelt, der an eine generische Fehlerseite weiterleitet.

%Vor%

Mit dieser Anordnung können Sie so viele Ausnahmen abfangen, wie Sie möchten (ich fange hier zwei, AccessDenied und HibernateOptimisticLockingFailureException), indem Sie den Spring-Resolver verwenden und alles andere vom benutzerdefinierten Resolver abgefangen wird. In der oben genannten akzeptierten Lösung müssten Sie mehr Java-Code schreiben, um andere Ausnahmen als AccessDenied abzufangen.

    
SteveT 28.04.2011, 15:52
quelle
7

Eine Möglichkeit, dies zu umgehen, besteht darin, einen anderen Handler zu erstellen, der org.springframework.web.servlet.HandlerExceptionResolver und org.springframework.core.Ordered -Schnittstellen. In Ihrer eigenen Implementierung tun Sie etwas wie folgt:

%Vor%

Mit der Implementierung der Ordered-Schnittstelle können Sie jetzt die Reihenfolge festlegen, in der die Exception-Handler aufgerufen werden. Das SimpleMappingExceptionResolver implementiert auch die Ordered-Schnittstelle, sodass Sie in Ihren Bean-Definitionen etwas tun können :

%Vor%

Die Bean mit dem LOWER-Bestellwert hat eine höhere Priorität (dh sie wird vor denen mit größeren Werten aufgerufen, in diesem Fall wird AccessDeniedExceptionResolver vor SimpleMappingExceptionResolver aufgerufen.)

Ich hoffe, das hat geholfen.

    
esaj 25.02.2011 19:27
quelle
2

Aufbauend auf Kartochs Antwort haben Sie in Ihrem Mapping einige Optionen. Sie könnten in den Ausnahmen, die Sie abfangen wollen, genauer sein als in RuntimeException, oder Sie könnten die Login-Ansicht für Ihren Handler für die AccessDeniedExcpetion angeben. So etwas wie redirect: / login? Err = 401 für den View-Namen.

Siehe die hier vorgenommene Konfiguration

Ссылка

Wo er mehrere Ausnahmen hat, die mit der einen Bean behandelt werden. Sie würden dasselbe tun und auf Ihre Login-Ansicht umleiten. Die einzige offene Frage ist, ob sie redirect: / viewname in der Konfiguration akzeptiert, und ich bin nicht in der Lage, das jetzt zu testen.

    
digitaljoel 25.02.2011 18:18
quelle
1

Noch eine weitere Option: Erstellen Sie eine Unterklasse von SimpleMappingExceptionResolver , die bestimmte Ausnahmeklassen ausschließen kann (sie bleiben für die Standardverarbeitung, in Ihrem Fall Spring Security).

%Vor%     
Geert 18.06.2012 09:25
quelle
0

Es scheint, dass SimpleMappingExceptionHandler hat eine Eigenschaft MappedHandlerClasses , nach der Sie suchen, da sie eine Reihe von Ausnahmen akzeptieren kann.

    
Kartoch 23.02.2011 17:32
quelle