2

私は次のシーケンスを持っています。

View1(POSTフォーム)-> PostController(モデルの作成とリダイレクト)-> GetController-> View2

私はRedirectAttributesを使用してPostControllerとGetControllerの間でモデルを渡します。

クラスPostController{
    public String mypost(...、final RedirectAttributes redirectAttrs){
        //モデルを作成します
        redirectAttrs.addFlashAttribute( "model"、model);
        "redirect:myget"を返します;
    }
}

@SessionAttributes( "model")
クラスGetController{

    public ModelAndView myget(@ModelAttribute( "model")final Model model){
        ModelAndView mav = new ModelAndView( "view2");
        mav.addObject( "model"、model);
        mavを返す;    
    }
}

ユーザーがブラウザで複数のタブを開いてから前のタブを更新すると、後者の開いたタブで上書きされます。

各タブを独立させたいのですが、誰かが私を正しい方向に向けてくれることを願っています。

ありがとう。

編集

問題は@SessionAttributes( "model")にあります。「Flash属性はリダイレクト前に一時的に保存され(通常はセッション内)、リダイレクト後にリクエストで使用できるようになり、すぐに削除されるためです。」したがって、セッション中のモデルが更新されるため、タブは互いに上書きされます。

4

1 に答える 1

0

通常、PRG を使用するときは、関連するすべての属性をリダイレクト URL に入れようとします。このようなもの...

public String myPost(ThingBean thingBean){
    Thing t = myService.updateThing(thingBean);
    return "redirect:thingView?id="+t.getId();    
}

そうすれば、リダイレクトされた get リクエストをインターセプトするときに、以前に保存されたセッション データに依存する必要がなくなります。

@RequestMapping(value="thingView",method=RequestMethod.Get)
public String thingView(Map<String,Object> model, @RequestParam(value="id") Integer id){
    model.put("thing",myService.getThing(id));
    return "thing/viewTemplate";    
}

モデルをセッション属性として保持することは、ページをグローバル変数に格納するようなものです。それは良い考えではありません。また、ページを更新すると、get リクエストは URL に含まれるもののみを送信します (それを使用している場合は、Cookie データも送信される可能性があります)。

于 2012-08-02T17:20:11.760 に答える