0

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”信息存储在客户端的任何地方(除了客户端访问以修改所需的“Foo”对象的 URL 查询字符串中),也没有传输回服务器。

Spring MVC 如何知道来自 tab#1 的提交应该修改 Foo#1,而来自 tab#2 的提交应该修改 Foo#2?(即,因此来自特定选项卡的特定编辑表单上的字段绑定到正确的 Foo 对象)

4

3 回答 3

0

会话通常保存为 cookie 或隐藏的输入字段。例如<input type="hidden" value="#SESSIONID" />,如果用户有一个打开的会话,也发送。这些会话标识与服务器上的对象和变量进行映射。

于 2013-04-27T23:13:07.393 回答
0

事实证明,您将遇到表单对象竞争条件,试图从两个不同的选项卡中编辑看起来像是两个不同的对象。当您打开 tab#2 以编辑“Foo#2”时,来自 tab#1 的提交实际上会修改 Foo#2(而不是预期的 Foo#1)。然后,当然,您会在尝试从第二个选项卡提交时遇到乐观锁定失败......

所以是的,您必须将一些“id”信息发送回服务器,以告诉它要更新哪个“Foo”对象。一些由 HMAC 支持的隐藏表单字段似乎是这样做的方法......

于 2013-04-30T20:01:21.750 回答
0

您需要将 id 保留在表单中的任何位置(不可变或隐藏字段),或者更好地将实体作为表单支持对象绑定到表单。同一浏览器中的选项卡共享同一会话。

于 2013-04-27T23:22:26.057 回答