呼之欲出 WebMail 開發手記 (三) 使用者資訊存取

iDotNetSpace發表於2009-07-15

關於使用者登入後的資訊儲存方式的討論,前有古人,後也會有來者。(我就不搗亂了~~)

 

一般有以下三種方式做為選擇:

一、儲存到 Session 中;
二、儲存到 Cookie 中;
三、儲存到 資料庫 中。

 

本系統在每個使用者登入系統後,先將使用者資訊序列化,然後再儲存到 Cookie 中。

 

附程式碼:

 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取
using System;

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取
/***************************************
 ********  里奧特線上郵件收發系統  *****
 **************************************
*/

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取
namespace Lyout.WebMail {
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取    
/// 
    
/// 使用者資訊
    
/// 

    [Serializable]
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取    
public class UserInfo {
        
private DateTime loginDate;
        
private int userID;
        
private string username;
        
private string nickname;
        
private int roleID = 0;

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
public UserInfo() {
        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
public UserInfo(int userID) {
            
this.userID = userID;
            
this.username = string.Empty;
            
this.nickname = string.Empty;
            
this.loginDate = DateTime.Now;
        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
public UserInfo(int userID, string username) {
            
this.userID = userID;
            
this.username = username;
            
this.nickname = username;
            
this.loginDate = DateTime.Now;
        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
public UserInfo(int userID, string username, string nickname) : this(userID, username) {
            
this.nickname = nickname;
        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
public UserInfo(int userID, string username, DateTime loginDate) {
            
this.userID = userID;
            
this.username = username;
            
this.nickname = username;
            
this.loginDate = loginDate;
        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
public UserInfo(int userID, string username, string nickname, DateTime loginDate) : this(userID, username, loginDate) {
            
this.nickname = nickname;
        }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
/// 
        
/// 登入日期
        
/// 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        public DateTime LoginDate {
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
get {
                
return this.loginDate;
            }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
set {
                
this.loginDate = value;
            }

        }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
/// 
        
/// 使用者ID
        
/// 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        public int UserID {
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
get {
                
return this.userID;
            }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
set {
                
this.userID = value;
            }

        }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
/// 
        
/// 登入名
        
/// 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        public string UserName {
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
get {
                
return this.username;
            }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
set {
                
this.username = value;
            }

        }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
/// 
        
/// 呢稱
        
/// 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        public string NickName {
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
get {
                
return this.nickname;
            }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
set {
                
this.nickname = value;
            }

        }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
/// 
        
/// 角色ID
        
/// 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        public int RoleID {
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
get {
                
return roleID;
            }

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
set {
                roleID 
= value;
            }

        }

    }

}


 

 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取
using System;
using System.Web.SessionState;
using System.Web;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取
/***************************************
 ********  里奧特線上郵件收發系統  *****
 **************************************
*/

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取
namespace Lyout.WebMail {
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取    
/// 
    
/// 使用者資訊操作
    
/// 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取    public class UserHelper {
        
private static readonly string UserIDKey = "UCO_USERIDKEY";

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
/// 
        
/// 刪除
        
/// 
        
/// 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        public static void Delete(HttpCookieCollection cookies) {
            cookies.Remove(UserIDKey);
        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
/// 
        
/// 從快取中取出使用者資料
        
/// 
        
/// 
        
/// 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        public static UserInfo GetUserInfo(HttpCookieCollection cookies) {
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
if (cookies[UserIDKey] != null{
                
string cookiedata = cookies[UserIDKey].Value;
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取                
if (!string.IsNullOrEmpty(cookiedata)) {
                    
// 反序列化使用者資訊
                    string userData = HttpContext.Current.Server.UrlDecode(cookiedata);
                    
byte[] bt = Convert.FromBase64String(userData);
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取                    
using (Stream smNew = new MemoryStream(bt)) {
                        IFormatter fmNew 
= new BinaryFormatter();
                        
return (UserInfo)fmNew.Deserialize(smNew);
                    }

                }

            }

            
return null;
        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
/// 
        
/// 把使用者資訊儲存到快取中
        
/// 
        
/// 
        
/// 

呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        public static void StoreUserInfo(HttpCookieCollection cookies, UserInfo info) {
呼之欲出 WebMail 開發手記 (三) 使用者資訊存取            
if (cookies!=null{
                IFormatter fm 
= new BinaryFormatter();
                MemoryStream sm 
= new MemoryStream();

                
// 序列化使用者資訊
                fm.Serialize(sm, info);
                sm.Seek(
0, SeekOrigin.Begin);

                
// 轉為 base64 格式
                byte[] byt = new byte[sm.Length];
                byt 
= sm.ToArray();
                
string userData = Convert.ToBase64String(byt);
                sm.Flush();

                cookies.Remove(UserIDKey);
                
// 儲存到 Cookie 中
                HttpCookie cookie = new HttpCookie(UserIDKey);
                cookie.Value 
= HttpContext.Current.Server.UrlEncode(userData);
                
// 有效期一天
                cookie.Expires = DateTime.Now.AddDays(1);
                cookies.Add(cookie); 
            }

        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
public static void StoreUserInfo(HttpCookieCollection cookies, int userID) {
            StoreUserInfo(cookies, 
new UserInfo(userID));
        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
public static void StoreUserInfo(HttpCookieCollection cookies, int userID, string username) {
            StoreUserInfo(cookies, 
new UserInfo(userID, username));
        }


呼之欲出 WebMail 開發手記 (三) 使用者資訊存取        
public static void StoreUserInfo(HttpCookieCollection cookies, int userID, string username, DateTime loginDate) {
            StoreUserInfo(cookies, 
new UserInfo(userID, username, loginDate));
        }

    }

}


 

以下是關於序列化的:

序列化定義

    序列化是將物件狀態轉換為可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為物件。在此過程中,先將物件的公共欄位和私有欄位以及類的名稱(包括類所在的程式集)轉換為位元組流,然後再把位元組流寫入資料流。在隨後對物件進行反序列化時,將建立出與原物件完全相同的副本。


序列化的目的

  1. 以某種儲存形式使自定義物件持久化
  2. 將物件從一個地方傳遞到另一個地方。
  3. 物件封送,遠端服務甚至網路資料流都運用了序列化的技術。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-609233/,如需轉載,請註明出處,否則將追究法律責任。

相關文章