簡単にするために、これらのコード スニペットは短縮されます。これの目的は、GET パラメータを取得してセッションに設定し、URL パラメータを削除して GET にリダイレクトすることです。基本的に、URI のクリーンアップ。これを行うためのより良い/より簡単な方法があれば、私はそれを聞いてうれしいです.
次のように定義されたコントローラーがあります。
@Controller
@RequestMapping("/path/page.xhtml")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@SessionAttributes({ "myParam1", "myParam2" })
public class MyController {
@RequestMapping(method = RequestMethod.GET, params = { "urlParam2" })
public String handleUriParam(@RequestParam(value = "urlParam2", required = false)
final Long urlParam2,
final RedirectAttributes redirs) {
// at this point, myParam1 is set on the session.
// now set the param as a flash attrib with the name of the session variable
redirs.addFlashAttribute("myParam2", urlParam2);
return "redirect:/path/page.xhtml";
}
@RequestMapping(method = RequestMethod.GET, params = {})
public String doGetStuff(ModelMap model) {
// do stuff using myParam1 and myParam2.
// problem is, myParam2 is on the session, but myParam1 is not!
}
}
コードが示すようmyParam1
に、リダイレクトが発生すると、どういうわけか設定が解除されます。ModelMap
メソッドに aを渡し、フラッシュ属性にhandleUrlParam
手動で追加することでこれを修正できますmyParam1
が、それは私の心の目的を無効にしているようです。
SessionAttribute
myParam1
リダイレクト後に削除されるのはなぜですか?
パラメータを URI から取り出してセッションに配置するより良い方法はありますか?
アップデート
したがって、使用するときはいつでも、実行したいRedirectAttributes
すべてSessionAttribute
の s を FlashAttributes のリダイレクトに入れることを確認する必要があるようです。そうしないと、それらが失われます。SessionAttribute
s が引き出されたためにこれが発生したと思いModelMap
ます(使用すると FlashAttributes に置き換えられます)。これは Spring のバグですか、それとも意図的な動作ですか? 意図的なものである場合、誰かがその理由を説明できますか? SessionAttribute
s は、会話セッションの完了によって削除されるまでそのままであると考えられていました。
補遺
提供された受け入れられた回答に照らして、URIパラメーターをユーザーのセッションに配置しながらクリアする方法について、私はまだ困惑しています。私が検討した 1 つのオプションは、半プリミティブ オブジェクト (java.lang.Integer、java.lang.String) のラッパーを作成することです。それらは URI 文字列に配置されないため、格納しようとしていますが、これはハックのようです。自分。GET パラメータを受け入れ、ユーザーのセッションに保存し、ユーザーのアドレス バーからそれらをクリアする (リダイレクトが必要になる) より良い方法があれば、私は喜んでそれを使用します。