2013-04-27 74 views
0

spring mvc請求範圍會話變量如何工作?Spring會話變量如何工作

例如,假設一個用戶想要從他/她的瀏覽器中修改一些「富」的對象,並打開了多個選項卡可以這樣做:例如,

 
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

原來你會遇到一個表單對象爭用條件,試圖編輯看起來像兩個不同標籤中的兩個不同對象。當您打開標籤#2編輯「Foo#2」時,選項卡#1的提交實際上會修改Foo#2(不是預期的Foo#1)。然後,當然,你會遇到一個樂觀的鎖失敗,試圖從第二個標籤提交...

所以是的,你將不得不發送一些'id'信息回到服務器告訴它哪個' Foo'對象來更新。由HMAC支持的一些隱藏表單字段似乎是這樣做的方法...

0

會話通常保存爲Cookie或隱藏輸入字段。例如,如果用戶打開會話,則也會發送<input type="hidden" value="#SESSIONID" />。這些會話ID與服務器上的對象和變量映射。

+0

Cookie和sessionid在這裏是無關緊要的,因爲我試圖區分同一用戶的不同對象,而不是不同用戶的對象。 此外,我的問題說沒有對象的「ID」信息被髮回服務器,所以隱藏的對象ID字段也沒有真正的工作。 – ManRow 2013-04-27 23:39:39

0

您需要將表單中的任何位置(不可變或隱藏字段)保留爲id或更好地將實體綁定到表單中作爲form backing object。同一瀏覽器中的選項卡共享相同的會話。

+0

因此,如果我使用「表單支持對象」,SpringMVC可以根據我發送請求的選項卡來判斷要更新哪個對象?即使沒有任何「ID」信息提交回服務器? – ManRow 2013-04-27 23:29:44

+0

該id需要保留在請求或會話中的某個地方。作爲表單參數或作爲後備對象中的字段。 – Stefan 2013-04-27 23:43:20

+0

即使只有form-b​​acking對象(而不是瀏覽器表單)知道'id',這樣做是否會起作用? – ManRow 2013-04-28 00:03:45