当前位置: 首页 > 知识库问答 >
问题:

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

程俊誉
2023-03-14

我有下面的顺序。

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

我使用重定向属性在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;    
    }
}

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

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

谢谢

编辑

问题在于@SessionAttributes(“模型”)。我之所以使用它,是因为“在重定向之前(通常在会话中)会临时保存Flash属性,以便在重定向之后对请求可用,并且会立即删除”。因此,选项卡会相互覆盖,因为会话中的模型已更新。


共有1个答案

厍彭薄
2023-03-14

通常,当我使用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数据)。

 类似资料:
  • 我在我的应用程序中构建了CSRF保护,只需在每个页面加载上生成一个随机令牌,将其放入会话,然后将令牌绑定到

  • 问题内容: 我有一个常规的Twitter Bootstrap 3标签。我要做的就是控制 一个元素来控制多个容器。 在此示例中,当我更改标签时,仅第一个被更改。我要两个容器都改变,而不仅仅是第一个。 谢谢! 问题答案: 我将 data-target 属性添加到a元素并更改第二个tab内容中的id 我修改了这行 您的: 我的更新: 第二个选项卡内容,您的: 我的更新:

  • 我正在Android应用程序上实现Chrome自定义选项卡(使用最新版本23.3.0)。最新版本的chrome选项卡允许您使用“builder.addToolbarItem()”方法在底部工具栏上添加按钮(根据堆栈溢出的答案,还有其他可自定义的内容。现在,我在为底部工具栏按钮添加操作意图时遇到了一个问题。我为我添加的每个工具栏项设置了两个不同的操作意图。但是,当打开chrome自定义选项卡,并单击

  • 我有30张单独的工作表,需要合并成一张有多个选项卡的工作表。我可以使用下面的脚本来完成这项工作,但每次都会创建一个新的工作表。当30张单独的工作表中的一张或全部更新时,我只希望这个脚本更新或重写以前创建的“主工作表”。 我正在寻找一个表,其中包含从每个地区的标签。这将允许我与单独更新的所有信息共享一个主控表。

  • 我正在为多种产品开发集中式管理模块。尝试跨多个产品维护同一会话。 对于Product1:验证成功并在响应标头中发送令牌 请求网址:http://localhost:8080/admin-web/rest/authenticate/ 请求标头

  • 让我知道如何完成它。 总共有3个街区。。1.标题2.导航3.主要内容。。 导航块应该是多帧的...每次你选择一个选项,它需要改变... 它必须更像一个菜单导航 导入随机导入wx 类TabPanel1(wx.面板): #---------------------------------------------------------------------- def init(自我,父): """"