我使用
Spring 3.1的新Flash属性支持在Controller中的RedirectAttributes对象上设置flash属性,然后调用重定向.该重定向请求反过来由一个过滤器捕获,然后过滤器以其快乐的方式将其发送到它所针对的JSP.问题:我无法从过滤器的doFilter()方法或JSP中看到flash属性.非Flash(URL)属性使它很好.
执行重定向的控制器:
@RequestMapping("/pages/login")
public String login (HttpServletRequest request, Map<String, Object> model, RedirectAttributes redirectAttributes) {
model.put("userId", "batman");
String redirectUrl = request.getParameter("redirectUrl");
if (redirectUrl != null) {
redirectAttributes.addAttribute("attr1","ababab");
redirectAttributes.addFlashAttribute("flashAttr1", "flashflash");
for (Iterator<String> iterator = model.keySet().iterator(); iterator.hasNext();) {
String key = iterator.next();
redirectAttributes.addFlashAttribute(key, model.get(key));
}
return "redirect:"+redirectUrl;
} else {
return "pages/login";
}
}
在这种情况下,获取重定向的过滤器不会做任何有趣的事情:
public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
//if (httpRequest.getSession().getAttribute("userId") == null) {
//...do some stuff here which invokes controller above as well as the redirect
//} else {
chain.doFilter(request, response);
//}
}
重定向到过滤器后面的页面:
...
<title>Test Web App 1</title>
</head>
<body>
<p>Flash attribute: <c:out value="${flashAttr1}"/></p>
<p>Welcome <c:out value="${userId}"/>!</p>
</body>
</html>
flashAttr1和userId都不会在页面中填充.控制器集的attr1非flash属性确实出现在页面的URL参数中,因此这似乎有效.
在我将springfamework.web设置为DEBUG之后,这是log4j的一些输出:
19:15:44,406 DEBUG http-8080-1 view.ContentNegotiatingViewResolver:494 - Returni
ng redirect view [org.springframework.web.servlet.view.RedirectView: name 'redir
ect:http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp';
URL [http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp]]
19:15:44,406 DEBUG http-8080-1 servlet.DispatcherServlet:1155 -
Rendering view [org.springframework.web.servlet.view.RedirectView: name
'redirect:http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp';
URL [http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp]] in
DispatcherServlet with name 'dispatcher'
19:15:44,421 DEBUG http-8080-1 support.DefaultFlashMapManager:199 - Saving Flash
Map=[Attributes={userId=batman, flashAttr1=flashflash}, targetRequestPath=/test-
webapp-1/protected/protected_page.jsp, targetRequestParams={attr1=[ababab]}]
19:15:44,421 DEBUG http-8080-1 servlet.DispatcherServlet:913 - Successfully comp
leted request
在我上面显示的过滤器短暂停留后,我被带到带有URL的页面
http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp?attr1=ababab
但是我没有希望显示JSP的属性.我还通过上面显示的doFilter()方法进行了调试,但未能在请求的会话中找到flash属性.
我现在还不确定到底出了什么问题.除了那些flash属性之外,一切都按预期工作.如果还有什么我应该提供的以使情况更清楚,我将很乐意.
最佳答案 几个月前使用与AJAX相关的重定向进入这个问题.如果使用只读HTTP POST模式,则可以指定
@ResponseStatus
来模拟POST.还要确保你的方法返回一个View或ModelAndView(而不是String),以便Spring知道查找给定@RequestMapping的Flash范围.
伪代码:
@RequestMapping(...)
@ResponseStatus(OK)
public ModelAndView login (...) {
...
}