/ / Spring MVC prosta kontrola dostępu z przechwytywacza: jak wyświetlić błąd - sprężyna, sprężyna-mvc

Wiosna MVC prosta kontrola dostępu z przechwytywacza: jak wyświetlić błąd - sprężyna, sprężyna-mvc

W webappie Spring 4.2 mam rights obiekt w sesji, z którego mogę wysłać zapytanieczy zalogowany użytkownik ma dostęp do określonej strony. Mogę sprawdzić prawa dostępu od kontrolera i przekierować na inną stronę z komunikatem. Problem polega na tym, że muszę to powtarzać dla każdej metody żądania w każdym kontrolerze.

Mogę przenieść prawie cały kod do przechwytywacza, ale nie mam do niego dostępu RedirectAttributes stamtąd, więc nie wiem, w jaki sposób mogę dodać komunikat o błędzie. Czy jest jakiś sposób?

@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";
}
...
}

Odpowiedzi:

1 dla odpowiedzi № 1

Tak, możesz! Nie jest tak dobrze zintegrowany jak w metodach kontrolera, ale można uzyskać dostęp do wyjściowej mapy flash w przechwytywaczu. Możesz znaleźć odniesienia do tego w rozdziale na Korzystanie z atrybutów flash w Spring Framework ReferenceManual. I dzięki ModelAndViewDefiningException, nadal możesz poprosić Spring o wykonanie przekierowania i przetworzenie wyjściowej mapy flash

Możesz umieścić coś takiego w przechwytywaczu:

    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);
}