2009-09-13 23 views
5

我正在設計一個功能來存儲上次登錄日期/時間在ASP.Net(MVC)應用程序。用於存儲用戶上次登錄信息的良好設計模式是什麼?

我的第一個直覺是將數據庫中的值存儲在用戶的配置文件記錄中,並在成功登錄時將值更新爲當前日期/時間。當然,只要我記錄該值,所有頁面將顯示會話成功登錄的日期和時間。

計劃B:記錄上一個會話的字段和記錄此會話的字段。登錄時,將此會話的日期/時間保存到「當前」字段,並將以前找到的值移到「前一個」字段(顯然)。正是這個字段提供了我的「最後登錄」值。

這是最好的方法,還是可以做得更優雅?

+0

爲什麼你需要存儲以前和當前的登錄時間? – 2009-09-13 10:03:06

+0

@Charles Conway - 只需要最後一次登錄日期/時間,但它會被當前登錄日期/時間覆蓋。它可以用於諸如'用戶上次登錄昨天11:52'或'自你上次登錄以來3個新項目'的功能 – 2009-09-13 10:55:36

回答

4

另一種方法是在登錄時從用戶記錄中讀取上次登錄日期/時間並將其保存到會話或會話cookie中。然後用當前日期/時間更新用戶記錄。然後在你的頁面上讀取存儲在session/cookie中的值。

當會話過期時,通常當用戶需要重新登錄時,舊時間將被刪除。它還具有速度和緩存的優點,因爲它是從會話/ cookie中讀取的。

但這取決於您的設置和應用程序,這對您是否可行。

UPDATE

只是要清楚......當前的日期/時間每次都保存到數據庫用戶表中的用戶登錄,但日期之前/時間寫入用戶表,現有值將被讀取並保存到會話或cookie中。然後使用當前時間戳更新用戶表中的日期/時間值。

如果您的身份驗證票證的持續時間超過會話時間,請使用Cookie方法,並將cookie的到期時間設置爲與身份驗證票證相同的屆滿日期。

+0

這將是我將如何處理這個問題 – 2009-09-13 09:57:13

+0

這將只保留客戶端上的信息。如果用戶從家中和工作中登錄,則信息將不正確。 您需要在服務器上保存這些信息。 – 2009-09-13 10:03:40

+0

這不需要在服務器上保留,因爲它在語義上是相同的。登錄後,唯一有趣的信息是以前的登錄始終存在 - 無論採取哪種方式。 – hurikhan77 2009-09-13 10:06:57

1

有一對夫婦的其他方式,你可以做到這一點...

  1. 而不必對用戶的記錄一欄,你可以有一個單獨的表,它記錄每個人的登錄。如果查看上次登錄日期很重要,或者爲了以後的報告保留登錄數據統計信息,這也可以授予您「顯示最近5次登錄」功能的能力。 (這會隨着時間的推移建立數據,並可能需要某種清理例程或時間表腳本。)

  2. global.asax有一個Session_End事件(或類似的東西)。當用戶第一次登錄時,該值可以存儲在會話變量中,然後當Session_End觸發它時將其寫入數據庫。這種方法可能最終導致更多的怪異而不值得,因爲你總是想知道如果Session_End沒有觸發會發生什麼,或者如果用戶在Session_End爲第一次登錄之前重新登錄之前重新登錄。

  3. 這已經有一段時間了,但有一種中間件讓asp.net讓你從基類繼承,並實現處理會話開始/結束之前或之後會話的代碼。我有一段時間沒有做ASP,所以我對此很朦朧。

+0

Session_end只有在將會話狀態存儲在proc中時才起作用。這是要記住的。出於這個原因,我從不使用它。 – RichardOD 2009-09-13 09:53:46

0

如何創建一個實現此功能的自定義序列化類?

這樣的類可以簡單地作爲blob序列化/反序列化到用戶的配置文件。除非您需要能夠查詢上次登錄日期,否則這可能是一個很好的解決方案。

我的第一個想法是簡單地使用Stack<T>來實現這一點,但雖然它是可序列化的,但它不提供會自動驅逐舊值的鉤子。

相關問題