技术开发 频道

WebMail 开发手记 (三) 用户信息存取

    【IT168技术文档】关于用户登录后的信息存储方式的讨论。

 一般有以下三种方式做为选择:
一、存储到 Session 中;
二、存储到 Cookie 中;
三、存储到 数据库 中。

第一篇  WebMail 开发手记 (一)(二)
第二篇  WebMail 开发手记 (三) 用户信息存取
第三篇  WebMail 开发手记 (四) 邮件收发准备
第四篇  WebMail 开发手记 (五) 邮件操作类
第五篇  WebMail 开发手记 (六) 邮件收取
第六篇  WebMail 开发手记 (七) 邮件发送
第七篇  WebMail 开发手记 (八) WebService 

本系统在每个用户登录系统后,先将用户信息序列化,然后再存储到 Cookie 中。

附代码:

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


 

 


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

    以下是关于序列化的:

    序列化定义

    序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。

0
相关文章