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


以下是关于序列化的:
序列化定义
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
序列化的目的
- 以某种存储形式使自定义对象持久化;
- 将对象从一个地方传递到另一个地方。
- 对象封送,远程服务甚至网络数据流都运用了序列化的技术。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?