关于用户登录后的信息存储方式的讨论,前有古人,后也会有来者。(我就不捣乱了~~)
一般有以下三种方式做为选择:
一、存储到 Session 中;
二、存储到 Cookie 中;
三、存储到 数据库 中。
本系统在每个用户登录系统后,先将用户信息序列化,然后再存储到 Cookie 中。
附代码:

用户信息类 UserInfo
using System;


/**//***************************************
******** 里奥特在线邮件收发系统 *****
***************************************/

namespace Lyout.WebMail
{

/**//// <summary>
/// 用户信息
/// </summary>
[Serializable]

public class UserInfo
{
private DateTime loginDate;
private int userID;
private string username;
private string nickname;
private int roleID = 0;


public UserInfo()
{
}


public UserInfo(int userID)
{
this.userID = userID;
this.username = string.Empty;
this.nickname = string.Empty;
this.loginDate = DateTime.Now;
}


public UserInfo(int userID, string username)
{
this.userID = userID;
this.username = username;
this.nickname = username;
this.loginDate = DateTime.Now;
}


public UserInfo(int userID, string username, string nickname) : this(userID, username)
{
this.nickname = nickname;
}


public UserInfo(int userID, string username, DateTime loginDate)
{
this.userID = userID;
this.username = username;
this.nickname = username;
this.loginDate = loginDate;
}


public UserInfo(int userID, string username, string nickname, DateTime loginDate) : this(userID, username, loginDate)
{
this.nickname = nickname;
}

/**//// <summary>
/// 登录日期
/// </summary>

public DateTime LoginDate
{

get
{
return this.loginDate;
}

set
{
this.loginDate = value;
}
}

/**//// <summary>
/// 用户ID
/// </summary>

public int UserID
{

get
{
return this.userID;
}

set
{
this.userID = value;
}
}

/**//// <summary>
/// 登录名
/// </summary>

public string UserName
{

get
{
return this.username;
}

set
{
this.username = value;
}
}

/**//// <summary>
/// 呢称
/// </summary>

public string NickName
{

get
{
return this.nickname;
}

set
{
this.nickname = value;
}
}

/**//// <summary>
/// 角色ID
/// </summary>

public int RoleID
{

get
{
return roleID;
}

set
{
roleID = value;
}
}
}
}



用户信息操作类 UserHelper
using System;
using System.Web.SessionState;
using System.Web;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;


/**//***************************************
******** 里奥特在线邮件收发系统 *****
***************************************/

namespace Lyout.WebMail
{

/**//// <summary>
/// 用户信息操作
/// </summary>

public class UserHelper
{
private static readonly string UserIDKey = "UCO_USERIDKEY";


/**//// <summary>
/// 删除
/// </summary>
/// <param name="cookies"></param>

public static void Delete(HttpCookieCollection cookies)
{
cookies.Remove(UserIDKey);
}


/**//// <summary>
/// 从缓存中取出用户数据
/// </summary>
/// <param name="cookies"></param>
/// <returns></returns>

public static UserInfo GetUserInfo(HttpCookieCollection cookies)
{

if (cookies[UserIDKey] != null)
{
string cookiedata = cookies[UserIDKey].Value;

if (!string.IsNullOrEmpty(cookiedata))
{
// 反序列化用户信息
string userData = HttpContext.Current.Server.UrlDecode(cookiedata);
byte[] bt = Convert.FromBase64String(userData);

using (Stream smNew = new MemoryStream(bt))
{
IFormatter fmNew = new BinaryFormatter();
return (UserInfo)fmNew.Deserialize(smNew);
}
}
}
return null;
}


/**//// <summary>
/// 把用户信息存储到缓存中
/// </summary>
/// <param name="cookies"></param>
/// <param name="info"></param>

public static void StoreUserInfo(HttpCookieCollection cookies, UserInfo info)
{

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);
}
}


public static void StoreUserInfo(HttpCookieCollection cookies, int userID)
{
StoreUserInfo(cookies, new UserInfo(userID));
}


public static void StoreUserInfo(HttpCookieCollection cookies, int userID, string username)
{
StoreUserInfo(cookies, new UserInfo(userID, username));
}


public static void StoreUserInfo(HttpCookieCollection cookies, int userID, string username, DateTime loginDate)
{
StoreUserInfo(cookies, new UserInfo(userID, username, loginDate));
}
}
}


以下是关于序列化的:
序列化定义
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
序列化的目的
- 以某种存储形式使自定义对象持久化;
- 将对象从一个地方传递到另一个地方。
- 对象封送,远程服务甚至网络数据流都运用了序列化的技术。