首页 文章

具有多个选项卡会话解决方法的Spring MVC PRG模式

提问于
浏览
2

我有以下顺序 .

View1 (POST form) -> PostController (create model and redirect) -> GetController -> View2

我正在使用RedirectAttributes在PostController和GetController之间传递模型

class PostController {
    public String mypost(..., final RedirectAttributes redirectAttrs){
        //create model
        redirectAttrs.addFlashAttribute("model", model);
        return "redirect:myget";
    }
}

@SessionAttributes("model")
class GetController {

    public ModelAndView myget(@ModelAttribute("model") final Model model){
        ModelAndView mav = new ModelAndView("view2");
        mav.addObject("model", model);
        return mav;    
    }
}

当用户在浏览器上打开多个选项卡,然后刷新前一个选项卡时,后一个打开的选项卡将覆盖它 .

我希望每个标签都是独立的,希望有人指出我正确的方向 .

谢谢 .

Edit

问题出在@SessionAttributes("model") . 我之所以使用它,是因为“重定向之后(通常在会话中)临时保存Flash属性,以便在重定向和 removed immediately 之后对请求可用 . ”因此,选项卡会相互覆盖,因为会话中的模型已更新 .

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数据) .

相关问题