Spring ModelAndView属性为null

时间:2017-04-12 11:15:39

标签: spring controller interceptor modelandview

我有一个简单的控制器和一个拦截器 在postHandle方法的拦截器中,我正在检查用户 问题:我的用户模型有时在控制器句柄之间为空。

  1. home-handle调用postHandle ==>用户模型不为空
  2. check_user-handle ==>调用的postHandle 用户模型为空
  3. 由redirectToErrorPage-handle ==>调用的postHandle;用户模型是 不再是null并包含一切,我所期待的 check_user-PostHandle调用。
  4. 这是我的控制器

    @Controller
    @SessionAttributes("user")
    public class HomeController {
    
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public ModelAndView home(Model model, HttpServletRequest request, HttpSession session) {
    
            User user = new User();
            return new ModelAndView("login", "user", user); 
            ////now User-Model was saved in the session
        }
    
    
        //now i'am redirectring user in the "check_user"-handle
        @RequestMapping(value = "/check_user", method = RequestMethod.POST)
        public ModelAndView checkUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, Model model,
                HttpServletRequest request, RedirectAttributes redirectAttr) {
            RedirectView redirectView = null;
            ModelAndView mav=null;
            try {       
                if(!bindingResult.hasErrors()){
                    redirectView = new RedirectView("home");
                    redirectView.setStatusCode(HttpStatus.FOUND);
                    redirectAttr.addFlashAttribute("httpStatus", HttpStatus.FOUND);
                    mav = new ModelAndView(redirectView);
                    return mav; //at next i entry post-handle from interceptor,
                                //which says to me, that user-model is null.
    
                }
            }
        //My interceptor redirects me to this handle.
        //After this handle within interceptor method "postHandle", i see, that 
        //user-object exists
        @RequestMapping(value = "/error", method = RequestMethod.GET)
        public String redirectToErrorPage(HttpServletRequest request){
            return "error";
        }
    }
    

    我的拦截器:

    public class UserInterceptor extends HandlerInterceptorAdapter {
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
            User user = (User) modelAndView.getModel().get("user");
            if(user == null || !user.isAdmin()){
                response.sendRedirect(request.getContextPath()+"/failed");
            }
        }
    }
    

    当我检索时,我的模型有哪些键,当“check_user”调用postHandle时,我只有一个键“totalTime”。我的模特怎么回事?

1 个答案:

答案 0 :(得分:0)

尝试修改postHandle(),如下所示:

...
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    User user = (User) request.getSession().getAttribute("user");
...