/ / Spring MVC contrôle d'accès simple à partir d'un intercepteur: comment afficher une erreur - spring, spring-mvc

Spring MVC contrôle d'accès simple à partir de l'intercepteur: comment afficher l'erreur - spring, spring-mvc

Dans une webapp 4.2 du printemps, j'ai un rights objet dans la session à partir de laquelle je peux interrogersi l'utilisateur connecté a accès à une page spécifique. Je peux vérifier les droits d'accès depuis un contrôleur et rediriger vers une autre page avec un message. Le problème est que je dois répéter ceci pour chaque méthode de demande dans chaque contrôleur.

Je peux déplacer presque tout le code vers un intercepteur mais je n'ai pas accès à RedirectAttributes à partir de là, alors je ne sais pas comment je pourrais ajouter le message d'erreur. Y a-t-il un moyen?

@Controller
@SessionAttributes("rights")
@RequestMapping("/f")
public class FController {
...
@RequestMapping(value="/edit/{id}", method=RequestMethod.GET)
public String edit(@PathVariable("id") int id,
@ModelAttribute("rights") UserRights rights,
RedirectAttributes redA, ModelMap model) throws SQLException {
if (!rights.canAccess("/f/edit")) {
redA.addFlashAttribute("errormessage", messages.getMessage("error.noright", null, Locale.getDefault()));
return "redirect:/f/list";
}
... // set up model
return "fEdit";
}
...
}

Réponses:

1 pour la réponse № 1

Oui, vous pouvez! Il n'est pas aussi bien intégré que dans les méthodes de contrôleur, mais vous pouvez accéder à la carte Flash de sortie dans un intercepteur. Vous pouvez trouver des références pour cela dans le chapitre sur Utiliser les attributs flash dans Spring Framework ReferenceManual. Et grâce à la ModelAndViewDefiningException, vous pouvez toujours demander à Spring de faire la redirection et de traiter la carte flash de sortie

Vous pourriez juste mettre quelque chose comme ceci dans un intercepteur:

    if (!rights.canAccess("/f/edit")) {
// get access to the output flash map
FlashMap redA = RequestContextUtils.getOutputFlashMap(HttpServletRequest request);
// add the redirect attributes
redA.put("errormessage", messages.getMessage("error.noright", null, Locale.getDefault()));
// prepare the redirection
ModelAndView redirMav = new ModelAndView("redirect:/f/list");
// ask the spring machinery to process the redirection
throw new ModelAndViewDefiningException(redirMav);
}