在Spring 4.2 webapp中,我在会话中有一个rights
对象,我可以从中查询登录用户是否可以访问特定页面。我可以检查控制器的访问权限,并重定向到带有消息的另一个页面。问题是我必须为每个控制器中的每个请求方法重复此操作。
我几乎可以将所有代码移动到拦截器,但是我无法从那里访问RedirectAttributes
,所以我不知道如何添加错误消息。有办法吗?
@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";
}
...
}
答案 0 :(得分:1)
是的,你可以!它不像控制器方法那样集成,但您可以在拦截器中访问输出flash映射。您可以在Spring Framework ReferenceManual的Using flash attributes一章中找到相关参考。感谢ModelAndViewDefiningException
,您仍然可以让Spring进行重定向并处理输出flash地图
你可以在拦截器中放置这样的东西:
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);
}