spring跨重定向传递数据
为何要重定向?
作用之一:防止表单重复提交
如何重定向?
// 在控制器方法返回的视图名称中,以redirect:开头的String不是用来查找视图的,而是用来指导浏览器进行重定向的路径return "redirect:/spitter/" + spitter.getUsername();
重定向丢数据
显然,对于重定向来说,模型并不能用来传递数据。重定向如何传递数据?
- 使用URL模板以路径变量和/或查询参数的形式传递数据;
- 通过flash属性发送数据;
通过URL模板进行重定向
通过连接String的方式:
@RequestMapping(value="/register", method=RequestMethod.POST)public String processRegistration( @RequestPart("profilePicture") MultipartFile profilePicture, @Valid Spitter spitter,Errors errors,HttpServletRequest http) throws Exception{profilePicture.transferTo(new File("/data/spittr/" + profilePicture.getOriginalFilename()));if(errors.hasErrors()) {return "registerForm";}spitterRepository.save(spitter);return "redirect:/spitter/" + spitter.getUsername();}// 当构建url或sql查询语句的时候,使用String拼接不安全
模板方式:
@RequestMapping("/tiles") public String hello (Model model) { model.addAttribute("name", "yangdong"); model.addAttribute("sex", "men"); model.addAttribute("age", "18"); return "redirect:/test/{name}"; }
因为模型中的sex和age属性没有匹配重定向URL中的任何占位符,所以它会自动以查询参数的形式附加到重定向URL上。
结果得到的重定向URL路径将会是: test/yangdong?sex=men&age=18小结:通过路径变量和查询参数的形式跨重定向传递数据是很简单直接的形式,但是它只能用来发送简单的值,例如String和数字的值。
使用flash属性
有个方案是将对象放到会话(session)中。会话能够长期存在,并且能够跨多个请求。所以我们能在重定向发送之前将对象放到会话中,并在重定向后,从会话中将其取出。当然,我们还要负责在重定向后再会话中将其清理掉。 实际上,Spring也认为将跨重定向存活的数据放到会话中是一个很不错的选择。但是,Spring认为我们并不需要管理这些数据,相反,Spring提供了将数据发送为flash属性的功能。按照定义,flash属性会一直携带这些数据直到下一次请求,然后才会消失。
@RequestMapping(value="/register", method=RequestMethod.POST)public String processRegistration( @RequestPart("profilePicture") MultipartFile profilePicture, @Valid Spitter spitter,Errors errors,Model model) throws Exception{ profilePicture.transferTo(new File("/data/spittr/" +profilePicture.getOriginalFilename())); if(errors.hasErrors()) { return "registerForm"; } spitterRepository.save(spitter); model.addAttribute("username", spitter.getUsername()); model.addAttribute("password",spitter.getPassword()); return "redirect:/spitter/{username}";}