printemps gestionnaire d'exception à ne pas traiter certains types d'exception
ive créé un simple gestionnaire d'exception dans mon printemps 2.5 application. Actuellement, il attrape tous les Exception
s et montre une stacktrace page.
c'est bien beau, mais maintenant, le printemps de sécurité n'est pas correctement le coup de la non-utilisateur connecté à la page de connexion, à la place de ma page d'exception est indiqué par le printemps de l'exception de sécurité:
org.springframework.security.AccessDeniedException
Le problème est que cette application ne dispose pas de sa propre Exception de la sous-classe qu'il utilise pour tous ses Exceptions, donc je dois la carte Exception
mais unmap AccessDeniedException
est-ce possible au printemps 2.5?
modifier: avec ressort de sécurité 2.0.1
mon haricot ressemble à ceci
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">common/error</prop>
</props>
</property>
</bean>**
la version de printemps de sécurité utilisez-vous?
printemps de sécurité 2.0.1
OriginalL'auteur mkoryak | 2011-02-23
Vous devez vous connecter pour publier un commentaire.
La façon dont nous traitons c'est d'avoir une exception personnalisée de résolution de la classe qui gère toutes les exceptions qui ne sont pas pris par d'autres gestionnaires d' - il implémente HandlerExceptionResolver, Ordonné.
Nous déclarons séparé SimpleMappingExceptionResolver bean qui attrape les exceptions spécifiques.
La commande est telle que notre résolveur personnalisé s'exécute après la SimpleMappingExceptionResolver.
L'effet est que les exceptions précisées (par exemple, AccessDeniedException) sont traitées par SimpleMappingExceptionResolver et dirigé vers les pages appropriées.
Tout autre moment de l'exécution exceptions sont gérées par le résolveur personnalisé, qui les transmet à une page d'erreur générique.
Cet arrangement permet d'attraper autant d'exceptions que vous le souhaitez (je catch 2 ici, AccessDenied et HibernateOptimisticLockingFailureexception) à l'aide du Printemps de résolution et tout le reste est pris par le résolveur personnalisé. Dans la solution retenue ci-dessus, vous devez écrire plus de code Java pour attraper les exceptions autres que AccessDenied.
Plus de détails édité dans ma réponse.
ah merci pour cette
OriginalL'auteur SteveT
Une façon de gérer cela est de créer un autre gestionnaire de mise en œuvre de la org.springframework.web.servlet.HandlerExceptionResolver et org.springframework.de base.Commandé -interfaces. Dans votre propre mise en œuvre, vous faites quelque chose comme ce qui suit:
Maintenant, la commande de l'interface de l'application vous permet d'indiquer à l'ordre les gestionnaires d'exceptions invoquées dans le. Le SimpleMappingExceptionResolver implémente la commande de l'interface aussi, de sorte que vous pourriez faire quelque chose comme suivant dans votre bean-définitions:
Le haricot le plus faible de l'ordre de la valeur a une PLUS grande priorité (ce qui signifie qu'il sera invoquée DEVANT ceux avec des valeurs plus grandes, dans ce cas AccessDeniedExceptionResolver est invoquée avant SimpleMappingExceptionResolver.
Espère que cela a aidé.
Ne serait-il pas plus simple d'ajouter un autre <prop> dans le SimpleMappingExceptionResolver pour AccessDeniedException que des cartes pour redirection:/login que d'avoir à mettre en œuvre une classe pour ce faire?
Merci, pas de précipitation. Une meilleure solution pourrait également apparaître avant que, si cela se produit, sans rancune 😉 Aussi, jetez un oeil à ce que digitaljoel suggéré ici.
Oui, ce serait plus simple, cependant la documentation pour SimpleMappingExceptionResolver dit " Examiner attentivement la façon dont la tendance est... ...Par exemple, "Exception" va correspondre à presque n'importe quoi, et sera probablement cacher d'autres règles.'. Je n'ai pas vérifié le code pour SimpleMappingExceptionResolver, mais il semble comme si vous ne pouvez pas définir l'ordre dans lequel les propriétés sont vérifiées, le "RuntimeException"-cartographie pourrait faire la vérification avant "AccessDeniedException" et de prendre à l'utilisateur de mauvaise page (ou peut-être le mappeur est assez intelligente pour vérifier eux dans l'ordre d'héritage).
OriginalL'auteur esaj
Bâtiment sur Kartoch réponse, en votre cartographie, vous avez quelques options. Vous pourriez être plus précis dans les exceptions que vous voulez prendre la place de RuntimeException, ou, vous pouvez spécifier la connexion pour votre gestionnaire pour l'AccessDeniedExcpetion. Quelque chose comme de redirection:/login?err=401 pour le nom de la vue.
Voir la configuration fait ici
http://www.mkyong.com/spring-mvc/spring-mvc-exception-handling-example/
Où il a plusieurs exceptions traitées avec une fève. Vous devez faire de même et de rediriger votre connexion view. La seule question en suspens est de savoir si elle accepte de redirection:/viewname dans la configuration, et je ne suis pas dans une position pour tester maintenant.
À droite, j'ai pensé que beaucoup, c'est pourquoi j'ai inclus la deuxième option.
OriginalL'auteur digitaljoel
Encore une autre possibilité: créer une sous-classe de
SimpleMappingExceptionResolver
qui est capable de l'exclusion de certaines classes d'exception (en les laissant pour le traitement par défaut, dans votre cas, Spring Security).OriginalL'auteur Geert
Il semble que SimpleMappingExceptionHandler a une propriété
MappedHandlerClasses
qui est ce que vous cherchez, car Il peut accepte un ensemble d'exceptions.Handler
objets qui gère la mappé exceptionsOriginalL'auteur Kartoch