Java Spring会话变量如何工作

Java Spring会话变量如何工作,java,forms,spring,session,spring-mvc,Java,Forms,Spring,Session,Spring Mvc,SpringMVC请求作用域会话变量是如何工作的 例如,假设用户想从浏览器中修改某些“Foo”对象,并打开多个选项卡进行修改:例如 HTTP-GET/tab#1: http://mywebsite.com/foo/edit?id=1 HTTP-GET/tab#2: http://mywebsite.com/foo/edit?id=2 HTTP-GET/tab#1:http://mywebsite.com/foo/edit?id=1 HTTP-GET/tab#2:http://mywebsite.

SpringMVC请求作用域会话变量是如何工作的

例如,假设用户想从浏览器中修改某些“Foo”对象,并打开多个选项卡进行修改:例如

HTTP-GET/tab#1: http://mywebsite.com/foo/edit?id=1 HTTP-GET/tab#2: http://mywebsite.com/foo/edit?id=2 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 HTTP-POST/URL=http://mywebsite.com/foo/save 没有“id”信息存储在客户端的任何位置(除了客户端访问以修改所需的“Foo”对象的URL查询字符串),也没有传输回服务器


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

会话通常保存为cookie或隐藏输入字段。例如,如果用户有一个打开的会话,
也会被发送。这些SessionID在服务器上映射为对象和变量

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

结果是,如果您试图编辑两个不同选项卡中看起来像两个不同对象的内容,您将遇到表单对象争用情况。当您打开选项卡2编辑“Foo#2”时,来自选项卡1的提交实际上会修改Foo#2(而不是预期的Foo#1)。然后,当然,您将在尝试从第二个选项卡提交时遇到乐观锁定失败


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

因此,如果我使用“表单支持对象”,SpringMVC可以简单地根据我发送请求的选项卡判断要更新哪个对象?即使不向服务器提交任何“id”信息,该id也需要保存在请求或会话中的某个位置。无论是作为表单参数还是作为支持对象中的字段。即使只有表单支持对象(而不是浏览器表单)知道“id”,这也会起作用吗?Cookie和sessionid在这里是无关的,因为我试图区分同一用户的不同对象,而不是不同用户的对象。另外,我的问题是没有对象“id”信息被发送回服务器,因此隐藏的对象id字段也不起作用。