2010-03-14 25 views
4

我想確保用戶不在兩個不同的瀏覽器選項卡或窗口(相同的Web瀏覽器實例)中編輯相同的表單數據。目的是阻止用戶意外覆蓋他們自己的數據,因爲他們通過一個非常長的表單過程繼續。在服務器上,通過屏幕輸入的持續數據被收集到會話中。唯一標識共享會話狀態的一個瀏覽器的兩個實例?

假設對於任何瀏覽器,所有標籤頁和窗口都在同一個實例中運行(即不是每個都在單獨的進程中)。很顯然,在這種情況下,瀏覽器選項卡和窗口共享相同的cookie,因此對於可行的解決方案,cookie修改似乎不存在問題。這也是他們共享相同會話狀態的原因。

考慮到已創建的形式,這是最後的潤色的一個,我該如何使用ASP.NET,希望很容易,來監督這個 「功能」?

+0

@jdk您可以檢查的Application_BeginRequest userName和是否會爲用戶重定向存在用戶幫助頁面。 – 2010-03-15 17:46:10

+0

@Sergey M.我不明白。如何在客戶端共享會話時幫助我區分不同的瀏覽器選項卡? – 2010-03-15 18:24:15

回答

3

你可以嘗試這樣的事:

商店整數作爲會話[ 「LastRequest」。把它放到頁面上的隱藏字段中。對於每個請求,您將一個添加到整數。

回發時,通過檢查Request.Form [「LastRequest」]是否等於Session [「LastRequest」],確保沒有其他請求。

如果您需要在發生回發之前檢查多個實例,則應該可以使用AJAX調用進行此操作。

0

在渲染指定頁面的過程中,生成GUID並保存會話。編寫一個通用處理程序,跟蹤指定頁面的情況,不存在兩個GUID。

以下數據結構將有所幫助。

class MultipleOpenedPage{ 
    string guid; 
    string pageURL; 
    DateTime timeStamp; 
    bool IsMultiplePageOpened(List<MultipleOpenedPage> list) 
    { 
    ///logic 
    } 
} 
+0

你如何確定請求是一個新實例,而不僅僅是用戶點擊F5? – CodingInsomnia 2010-03-14 19:26:14

+0

在GET請求的情況下,按下F5行爲是一樣打開新的實例在這兩種情況下,所以沒有簡單的方法來檢測新的HTTP GET請求。我們可以在頁面卸載時通過ajax請求進行檢測,但這些ajax請求有時會失敗。 在POST刷新的情況下,也可以通過將一個GUID在視圖狀態和在回發匹配視圖狀態與會話值GUID來檢測。 – Adeel 2010-03-15 06:19:42

0

由於網絡的無狀態性質,我不相信有一個可靠的方法來區分兩個瀏覽器窗口。但是,您可以在Session中存儲一個標誌,指定正在進行的長時間運行的進程。這樣,您就不在乎他們是否嘗試從相同的瀏覽器窗口或多個瀏覽器窗口重新運行該流程。訣竅是處理進程失敗的情況,並且沒有機會重置標誌,以便進程可以再次運行。

+0

如果我理解正確的OP,他沒有不應該被重新初始化一個過程,需要很長的時間在服務器上,而是一系列的收集一大堆的信息(會話)頁/通過第二個瀏覽器選項卡上的頁面進行重寫。 – 2010-03-16 11:37:37

+0

即使是這樣,我仍然不相信有辦法區分不同的瀏覽器窗口。我們正在討論的是找到一種通過多頁進程存儲用戶進度狀態的方法。這是Session的理想用途之一。因此,與其試圖檢測用戶如何達到他們所做的狀態,他應該簡單地設計系統以對用戶所處的狀態做出反應。 – Thomas 2010-03-16 14:54:00

+0

如果有人打倒downvote,請提供他們的推理。 – Thomas 2011-03-13 04:15:06

1

即使來自不同的選項卡,也無法區分同一頁面的兩個http POST。

這就像着名的後退按鈕問題 - 他們可以發佈,回推,並重新發布。

通常的解決方案是隱藏跟蹤字段,但很難讓它們可靠。

如果它是一個嚮導類型的過程,應該很容易檢測它們是否覆蓋已輸入的字段並顯示警告。

2

每次渲染表單時,將某個隱藏字段的值設置爲隨機字符串。在會話狀態中存儲相同的字符串。當用戶回帖時,檢查兩個值是否相等。如果不是,這必須是重新發布。

0

我通過創建一個從System.Web.UI.Page繼承的基類和page_load/init事件來創建一個包含特定於用戶實例的信息的對象。

這是,這是每個新創建的頁面中獲取的對象的它自己的實例,因此可以保持不同的狀態/屬性可以用來製造不同的編輯數據在同一頁上。

只是一個想法,因爲它是有點周圍的事物以不同的方式。

相關問題