spring mvc请求范围的会话变量如何工作?
例如,假设用户想要从他/她的浏览器修改一些'Foo'对象,并打开多个标签来执行此操作:例如,
HTTP-GET/tab#1: http://mywebsite.com/foo/edit?id=1 HTTP-GET/tab#2: http://mywebsite.com/foo/edit?id=2
并且都通过
提交HTTP-POST/URL = http://mywebsite.com/foo/save
没有“id”信息存储在客户端的任何地方(除了客户端访问的URL查询字符串以修改所需的“Foo”对象),也不会传输回服务器。
Spring MVC如何知道来自选项卡#1的提交应该修改Foo#1,而选项卡#2的提交应该修改Foo#2? (即,特定选项卡中特定编辑表单上的字段绑定到正确的Foo对象)
答案 0 :(得分:0)
会话通常保存为Cookie或隐藏的输入字段。例如,如果用户具有打开的会话,则也会发送<input type="hidden" value="#SESSIONID" />
。这些sessionsid与服务器上的对象和变量一起映射。
答案 1 :(得分:0)
您需要将id保留在表单中的任何位置(不可变或隐藏字段),或者更好地将实体绑定到表单form backing object。同一浏览器中的选项卡共享同一会话。
答案 2 :(得分:0)
原来你会遇到一个表格 - 对象竞争条件,试图从两个不同的标签中编辑两个不同的对象。当您打开选项卡#2以编辑“Foo#2”时,选项卡#1的提交实际上将修改Foo#2(不是预期的Foo#1)。然后,当然,你会遇到试图从第二个标签提交的乐观锁定失败......
所以是的,您必须将一些'id'信息发送回服务器,告诉它要更新哪个'Foo'对象。由HMAC支持的一些隐藏表单字段似乎是这样做的方法......