RedirectAttributes の flashAttributes を機能させようとしているときに問題が発生しました。Tomcat 7.0 で Spring MVC を使用して構築された Web サイトと、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}
Web サイトに Tomcat で直接アクセスしているか、Apache リバース プロキシ経由でアクセスしているかによって、同じコードでも異なる結果が得られます。
Tomcat の応答:
フラッシュ メッセージ: フラッシュ メッセージ
セッション メッセージ: セッション メッセージ
Apache mod_proxy の背後:
Flash メッセージ:
セッション メッセージ: セッション メッセージ
プロキシ経由で Web サイトにアクセスすると、フラッシュ メッセージが表示されないのはなぜですか?
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>
ティア。