我使用Spring web MVC 4.3.5
测试了以下内容。
以下控制器显示重定向后Flash属性正常工作的示例:
@Controller
@RequestMapping("/redirection")
public class RedirectionController {
private static final Logger logger = Logger.getLogger(RedirectionController.class);
@RequestMapping(path="/pageA", method=RequestMethod.GET)
public String foo(RedirectAttributes redirectAttributes
, HttpServletRequest request
) {
redirectAttributes.addFlashAttribute("foo", "bar");
return String.format("redirect:%s", "/redirection/pageB.do");
}
@RequestMapping(path="/pageB", method=RequestMethod.GET)
public String boo(final HttpServletRequest request, final Model model) {
printModelAttributes(model);
return "page-b";
}
private static void printModelAttributes(final Model model) {
Map<String, Object> map = model.asMap();
logger.info(String.format("model attributes are: %s", map.keySet()));
}
}
当我们使用浏览器访问/pageA
路径时,我们会自动重定向到/pageB
,/pageB
的控制器方法会按预期看到Flash属性:
14:35:18,740 INFO [webgui.RedirectionController](http- / 127.0.0.1:8082-3)模型属性为:[foo]
但是,如果我更改return语句,则从:
生成重定向字符串return String.format("redirect:%s", "/redirection/pageB.do");
......来:
return String.format("redirect:%s", "/.."+request.getContextPath()+"/redirection/pageB.do");
...我们仍然被重定向到相同的/pageB
路径,但这次缺少flash属性:
14:34:51,892 INFO [webgui.RedirectionController](http- / 127.0.0.1:8082-3)模型属性为:[]
我假设这是由于Spring MVC试图变得聪明并试图猜测重定向是否会将我们带到另一个应用程序(不同的上下文路径),在这种情况下它不会将flash属性放在会话中在其他申请中,它们无论如何都不可用。
显然,重定向字符串中存在/..
会导致Spring MVC认为我们正在更改应用程序。
我的问题是: