5

簡単にするために、これらのコード スニペットは短縮されます。これの目的は、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 のリダイレクトに入れることを確認する必要があるようです。そうしないと、それらが失われます。SessionAttributes が引き出されたためにこれが発生したと思いModelMapます(使用すると FlashAttributes に置き換えられます)。これは Spring のバグですか、それとも意図的な動作ですか? 意図的なものである場合、誰かがその理由を説明できますか? SessionAttributes は、会話セッションの完了によって削除されるまでそのままであると考えられていました。

同様の StackOverflow の投稿はこちら

補遺

提供された受け入れられた回答に照らして、URIパラメーターをユーザーのセッションに配置しながらクリアする方法について、私はまだ困惑しています。私が検討した 1 つのオプションは、半プリミティブ オブジェクト (java.lang.Integer、java.lang.String) のラッパーを作成することです。それらは URI 文字列に配置されないため、格納しようとしていますが、これはハックのようです。自分。GET パラメータを受け入れ、ユーザーのセッションに保存し、ユーザーのアドレス バーからそれらをクリアする (リダイレクトが必要になる) より良い方法があれば、私は喜んでそれを使用します。

4

1 に答える 1

7

そこで、コードとインターネットを調べて、なぜ機能しないのかを調べました。

Spring には 2 つの完全に別個のモデル マップがあります。1 つは標準ビュー レンダリング用で、もう 1 つはリダイレクトが発行された場合です。これは で確認できますModelAndViewContainer

からの結果に基づいて、mavContainer#getModel()セッション属性の永続化が行われるようになりました。リダイレクト シナリオの場合、これはリダイレクト モデルを返します。したがって、標準Model/に設定したものはすべてModelMap失われます。

これは、標準モデルの属性について話すときに理にかなっています。モデルは、主にオブジェクトをビューに渡すためにあります。リダイレクトを使用する場合、まったく異なる状況に対処しています。HTTP リダイレクトを介してオブジェクトを転送する必要があるため、分離された文字列とフラッシュ ベースのモデルです。

ただし、この機能を設計するときにセッション属性を忘れていたように感じます。Spring の Jiraにはいくつかの良い議論がありますが、この特定の問題に対処するものはありません。

はい、これは Spring の Jira のトピックになる可能性があります。また、リダイレクトの使用時にセッション モデル属性を設定できなくなるため、バグとして分類される可能性があります。Spring にセッション属性を強制的に保存させることRedirectAttributes#addFlashAttributeは、IMO のハックであり、それ自体が一種のバグです。

于 2013-06-15T17:06:16.137 に答える