呼之欲出 WebMail 開發手記 (三) 使用者資訊存取
關於使用者登入後的資訊儲存方式的討論,前有古人,後也會有來者。(我就不搗亂了~~)
一般有以下三種方式做為選擇:
一、儲存到 Session 中;
二、儲存到 Cookie 中;
三、儲存到 資料庫 中。
本系統在每個使用者登入系統後,先將使用者資訊序列化,然後再儲存到 Cookie 中。
附程式碼:
using System;
/***************************************
******** 里奧特線上郵件收發系統 *****
***************************************/
namespace Lyout.WebMail {
///
/// 使用者資訊
///
[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;
}
///
/// 登入日期
///
public DateTime LoginDate {
get {
return this.loginDate;
}
set {
this.loginDate = value;
}
}
///
/// 使用者ID
///
public int UserID {
get {
return this.userID;
}
set {
this.userID = value;
}
}
///
/// 登入名
///
public string UserName {
get {
return this.username;
}
set {
this.username = value;
}
}
///
/// 呢稱
///
public string NickName {
get {
return this.nickname;
}
set {
this.nickname = value;
}
}
///
/// 角色ID
///
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 {
///
/// 使用者資訊操作
///
public class UserHelper {
private static readonly string UserIDKey = "UCO_USERIDKEY";
///
/// 刪除
///
///
public static void Delete(HttpCookieCollection cookies) {
cookies.Remove(UserIDKey);
}
///
/// 從快取中取出使用者資料
///
///
///
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;
}
///
/// 把使用者資訊儲存到快取中
///
///
///
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));
}
}
}
以下是關於序列化的:
序列化定義
序列化是將物件狀態轉換為可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為物件。在此過程中,先將物件的公共欄位和私有欄位以及類的名稱(包括類所在的程式集)轉換為位元組流,然後再把位元組流寫入資料流。在隨後對物件進行反序列化時,將建立出與原物件完全相同的副本。
序列化的目的
- 以某種儲存形式使自定義物件持久化;
- 將物件從一個地方傳遞到另一個地方。
- 物件封送,遠端服務甚至網路資料流都運用了序列化的技術。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-609233/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 呼之欲出 WebMail 開發手記 (八) WebServiceWebAI
- 呼之欲出 WebMail 開發手記 (六) 郵件收取WebAI
- 呼之欲出 WebMail 開發手記 (七) 郵件傳送WebAI
- 呼之欲出 WebMail 開發手記 (一) 基本功能WebAI
- 呼之欲出 WebMail 開發手記 (五) 郵件操作類WebAI
- 呼之欲出 WebMail 開發手記 (四) 郵件收發準備WebAI
- webmail系統如何進行使用者管理?WebAI
- MySpy開發手記 (轉)
- 阿里Java開發手冊思考(三)阿里Java
- 開發筆記:手動搭建系統後臺-認證使用者筆記
- 微信開發筆記——微信網頁登入授權,獲取使用者資訊筆記網頁
- 用觸發器記錄資料庫使用者登陸資訊觸發器資料庫
- 微信公眾號支付開發手記(node)
- 擁抱ES6——OSSJavaScriptSDK開發手記JavaScript
- Servlet/JSP 容器開發手記2 (轉)ServletJS
- 資訊系統開發事實規範-使用者管理
- 記錄ORACLE使用者登入資訊Oracle
- Kinect開發學習筆記之(三)Kinect開發環境配置筆記開發環境
- 智慧手機使用者行為分析–資訊圖
- 手遊《奧林劈圖》的開發日記(三)
- 自己動手開發一個 Web 伺服器(三)Web伺服器
- 職教系統專案開發手冊(三) (轉)
- 爬蟲實戰(三):微博使用者資訊分析爬蟲
- 微信開發——通過授權獲取使用者的基本資訊
- 資料資訊圖——觸屏手機使用者是如何看資訊的?
- 阿里巴巴java開發手冊筆記阿里Java筆記
- 手把手教你做測開:開發Web平臺之使用者資訊Web
- 網頁播放器開發系列筆記(三)網頁播放器筆記
- 2017前端開發手冊三-前端職位描述前端
- Egg.js+MongoDB開發小程式介面 (三) 與微信伺服器互動及使用者資訊加解密JSMongoDB伺服器解密
- Strategy Analytics:調查顯示三星手機使用者基本上不使用三星自主開發軟體
- 資訊化打造核心能力——談研發資訊保安(三)(轉)
- 優化 Go 中的 map 併發存取優化Go
- 有好的webmail系統嗎WebAI
- 自動化測試系統開發手記(一)
- cocos2d-x 2.2 開發手記2
- 《PHP與MySQL動態網站開發》小編手記PHPMySql網站
- webpack入門學習手記(三)Web