2008-09-10 21 views
4

假設用戶正在瀏覽網站,然後執行一些更改數據庫(假設他們添加了註釋)的操作。然而,當實際添加評論的請求進入時,我們發現我們需要強制他們登錄才能繼續。當請求被登錄頁面中斷時,保留HTTP POST數據

假設登錄頁面要求輸入用戶名和密碼,並將用戶重定向回需要登錄時要使用的URL。該重定向工作僅查找具有GET參數的URL,但如果請求最初包含某些HTTP POST數據,則現在丟失了該數據。

任何人都可以推薦一種方法來處理這種情況下,當涉及HTTP POST數據?

很顯然,如果有必要,登錄頁面可以動態生成一個帶有所有POST參數的表單(雖然看起來很亂),但即使如此,我也不知道登錄頁面的任何方式將用戶重定向到其預期頁面,同時將POST數據保留在請求中。


編輯:一個附加的約束,我應該已經明確 - 想象一下,直到用戶提交他們的意見,我們不知道,如果登錄是必需的。例如,他們的Cookie在加載表單和實際提交評論之間可能已過期。

回答

2

2個選擇:

  1. 寫出從登錄頁面凌亂的形式,和JavaScript form.submit(它)的頁面。
  2. 讓登錄頁面本身發佈到請求頁面(使用以前的值),並讓該頁面的控制器執行登錄驗證。把它轉換成你已經有的用於檢測未登錄用戶的邏輯(框架根據它們的工作方式而有所不同)。在僞MVC:

     CommentController { 
      void AddComment() { 
      if (!Request.User.IsAuthenticated && !AuthenticateUser()) { 
       return; 
      } 
      // add comment to database 
      } 

      bool AuthenticateUser() { 
      if (Request.Form["username"] == "") { 
       // show login page 
       foreach (Key key in Request.Form) { 
        // copy form values 
        ViewData.Form.Add("hidden", key, Request.Form[key]); 
       } 
       ViewData.Form.Action = Request.Url; 

       ShowLoginView(); 
       return false; 
       } else { 
       // validate login 
       return TryLogin(Request.Form["username"], Request.Form["password"]); 
       } 
      } 
     } 
11

這是Ajax技術可能有用的一個好地方。當用戶點擊提交按鈕時,在實際提交頁面之前,在客戶端顯示登錄對話框並使用服務器進行驗證。

我能想到的另一種方式是在主頁面中動態顯示或隱藏DIV標籤中的登錄控件。

1

在他們提交的頁面上收集數據,並在它們通過登錄序列關閉時將其存儲在後端(數據庫?)中,並使用登錄表單在頁面上隱藏事務ID或類似內容。完成後,通過使用後端的事務ID查找它們,將它們返回到它們要求的頁面,並將所有發佈到表單中的數據再次轉儲到表單中以供再次預覽,或者只運行該頁面運行的任何代碼。

注意,許多系統,如博客,解決這個問題通過在相同的形式之一發布評論,如果用戶需要先登錄發表評論,目前尚未有登錄字段。

2

只需將POST中的所有必要數據存儲在會話中,直至登錄過程完成。或者在數據庫中存儲某種臨時表來存儲並檢索它。顯然這是僞代碼,但是:

if (!loggedIn) { 
    StorePostInSession(); 
    ShowLoginForm(); 
} 

if (postIsStored) { 
    RetrievePostFromSession(); 
} 

或沿着這些線。

1

我知道它說的語言無關,但爲何不把你所使用的服務器端語言提供約定的優勢在哪裏?如果它是Java,則可以通過設置Request屬性來保持數據。您將使用控制器來處理表單,檢測登錄,然後轉發。如果設置了屬性,那麼只需用該數據預填充表單?

編輯:你也可以使用一個會話作爲指出,但我敢肯定,如果你使用Java中的轉發回到登錄頁面,請求屬性將持續。

3

你可能想調查爲什麼Django removed this feature自己實現之前。它似乎不是一個Django特定的問題,而是另一個跨站點僞造攻擊。