ive Configurez un gestionnaire d'exception simple dans mon application Spring 2.5. Actuellement, il attrape tout Ceci est bien et bon, mais maintenant Spring Security ne donne pas correctement à l'utilisateur non connecté à la page de connexion, à la place de mon exception. La page est affichée avec l'exception de sécurité à ressort: p> Le problème est que cette application n'a pas sa propre sous-classe d'exception qu'elle utilise pour toutes ses exceptions, de sorte que je dois donc mapper est-ce possible dans le printemps 2.5? P> edit forte>: avec Security 2.0 .1 p> Ma bean ressemble à ceci p> exception code> s et affiche une page StackTrace.
Exception code> mais lamap
accessréiedException code> p>
6 Réponses :
Il semble que SimplemappingExceptionHandler a une propriété Mappehandlerclasses code>, ce que vous recherchez, comme cela peut accepter un ensemble d'exceptions. P>
Êtes-vous sûr, de la DOC semble que le champ prend une liste des objets code> manutention code> gérer les exceptions mappées
Bâtiment sur la réponse de Kartoch, dans votre mappage, vous avez quelques options. Vous pouvez être plus précis dans les exceptions que vous souhaitez attraper au lieu de RunTimeException ou, vous pouvez spécifier la vue de connexion de votre gestionnaire pour l'accès à l'accèsdréedexcpetion. Quelque chose comme rediriger: / se connecter? ERR = 401 pour le nom de la vue. P>
Voir la configuration effectuée ici P>
http://www.mkyong.com/spring -MVC / ressort-mvc-exception-Exemple de manutention / p>
où il a plusieurs exceptions manipulées avec le haricot unique. Vous feriez la même chose et redirieriez votre vue de connexion. La seule question ouverte est si elle accepte la redirection: /Nom de la vue dans la configuration, et je ne suis pas en mesure de tester cela maintenant. P>
Je ne peux pas être plus précis parce que l'application que j'ai héritée jette déjà runtimédiexception partout, je ne peux pas aller le changer dans un million d'endroits
Droite, je pensais que beaucoup, c'est pourquoi j'ai inclus la deuxième option.
Un moyen de gérer cela consiste à créer un autre gestionnaire implémentant le org.springframework.web.servlet.handlerexceptionResolver em> et org.springframework.core.ordorded em> -interfaces. Dans votre propre implémentation, vous faites quelque chose comme ce qui suit: <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">common/error</prop>
</props>
</property>
<property name="order" value="1"/>
</bean>
<bean class="package.to.your.handler.AccessDeniedExceptionResolver">
<property name="order" value="0"/>
</bean>
Merci ces œuvres .. Je dois attendre 20 heures pour vous donner les points.
Ne serait-il pas plus facile de simplement ajouter un autre
@mkoryak: Merci, pas de pressée. Une meilleure solution pourrait également apparaître avant cela, si cela se produit, pas de sentiments difficiles;) Aussi, jetez un coup d'œil à ce que DigitalJoel a suggéré ici.
@DigitalJoel: Oui, ce serait plus simple, mais la documentation de SimplemappingExceptionResolver dit «examinez attentivement la manière dont le modèle est spécifique ... ... Par exemple,« Exception »correspondra à presque n'importe quoi et cachera probablement les autres règles.». Je n'ai pas vérifié le code de SimpleMappingExceptionResolver, mais cela ressemble à si vous ne pouvez pas définir dans quel ordre les propriétés sont cochées, la "RunTimeException" peut être vérifiée avant "AccèsReiedException" et prenons l'utilisateur à une mauvaise page (ou Peut-être que le mappeur est assez intelligent pour les vérifier dans l'ordre d'héritage).
La façon dont nous gérons cela consiste à avoir une classe de résolution d'exception personnalisée qui gère toutes les exceptions qui ne sont pas attrapées par d'autres gestionnaires - il implémente HandlerExceptionResolver, commandé.
Nous déclarons un haricot de SimplememappingExceptionSolver distinct qui attrape des exceptions spécifiques. p>
La commande est telle que notre résolution personnalisée fonctionne après la méthode SimplemappingExceptionResolver. P>
L'effet est que les exceptions spécifiées (par exemple, l'accèsdeniedException) sont gérées par SimplemappingExceptionResolver et dirigé vers les pages appropriées. P>
Toute autre exception du temps d'exécution est traitée par le résolveur personnalisé, qui transmet à une page d'erreur générique. P> Cet arrangement vous permet d'attraper autant d'exceptions que vous le souhaitez. (J'attrape 2 ici, accessionné et hibernateoptimisticLockingFailureException) à l'aide du résolveur à ressort et tout le reste est capturé par le résolveur personnalisé. Dans la solution acceptée ci-dessus, vous devriez écrire plus de code Java pour attraper des exceptions autres que l'accès. P> p>
Vous venez de dire exactement la même chose que la solution acceptée a, sauf avec moins de détails: p
Une autre option: Créer une sous-classe de SimplemappingExceptionResolver code> capable d'exclure certaines classes d'exception (les laissant pour le traitement par défaut, dans votre sécurité de printemps).
public class ExclusionExceptionResolver extends SimpleMappingExceptionResolver implements InitializingBean {
private Class[] excludedClasses;
@Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
for (Class<?> excludedClass : excludedClasses) {
if (excludedClass.isInstance(ex)) {
return null;
}
}
return super.doResolveException(request, response, handler, ex);
}
public void setExcludedClasses(Class[] excludedClasses) {
this.excludedClasses = excludedClasses;
}
@Override
public void afterPropertiesSet() throws Exception {
if (excludedClasses == null) {
excludedClasses = new Class[]{};
}
}
}
Je suis de nombreuses années de retard, mais j'ai eu ce problème exact, et aucune des solutions proposées ne fonctionnait très bien.
Ce que j'ai découvert, c'est que si je repousser l'exception de mon gestionnaire de captures, le ressort est par défaut de printemps. Handler commence: p>
8 ans, oui vous êtes un peu en retard à ce jeu. Les gens utilisent toujours le printemps? :)
Je ne sais pas mais je suis aussi intéressé par la solution.
Quelle version de Spring Security utilisez-vous?