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%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.
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.
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.
Es scheint, dass SimpleMappingExceptionHandler hat eine Eigenschaft MappedHandlerClasses
, nach der Sie suchen, da sie eine Reihe von Ausnahmen akzeptieren kann.
Tags und Links exception-handling spring-mvc spring-security