我在尝试使 RedirectAttributes 的 flashAttributes 工作时遇到问题。我已经在 Tomcat 7.0 上设置了一个使用 Spring MVC 构建的网站,并使用 Apache mod_proxy 和 ajp 设置了一个反向代理。
我面临的问题也描述在问题,但那里提供的答案根本不适用于我的情况(我使用的是 Tomcat 的单个实例)。
这是我用于测试目的的控制器的一个片段:
@RequestMapping(value = "/land", method = RequestMethod.GET)
public String land(RedirectAttributes redirectAttrs, Model model) {
return "redirect_landing";
}
@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public String redirect(RedirectAttributes redirectAttrs, HttpSession session) {
// add a session message
session.setAttribute("sessionMessage", "a session message");
// add a flash message
redirectAttrs.addFlashAttribute("flashMessage", "a flash message");
// define the base url
String baseUrl = "http://localhost:8080/MyApp/";
// String baseUrl = "http://dev.myapp.lan/";
return "redirect:" + baseUrl + "land";
}
模板就这么简单:
Flash message: ${flashMessage}
Session message: ${sessionMessage}
相同的代码给出不同的结果,具体取决于我是直接在 Tomcat 上还是通过 apache 反向代理访问网站:
Tomcat 的响应:
Flash message: 一条消息
Session message: 一个会话消息
在 apache mod_proxy 后面:
Flash 消息:
Session message: 一个会话消息
为什么通过代理访问网站时没有闪烁消息?
我检查了RedirectAttributesModelMap.java和ModelMap.java的代码,但那里没有足够的信息(显然逻辑是在其他地方实现的)。
注意:我总是可以回退到会话属性来实现我的目标,但是对于那些在反向代理后面使用 Tomcat 的人来说,这个问题已经足够有趣了
代理配置(片段):
<VirtualHost *:80>
ServerName dev.myapp.lan
ProxyPass / ajp://localhost:8009/MyApp/
ProxyPassReverseCookiePath /MyApp /
ProxyPassReverseCookieDomain localhost MyApp
ErrorLog /var/log/apache2/phonebook-error.log
LogLevel warn
CustomLog /var/log/apache2/phonebook-access.log combined
</VirtualHost>
TIA。