/// 说明
/// CUser:用户信息类,字段包括UserID、Username、以及其他一些个人信息
/// COnlineInfo:在线信息类,字段包括:用户ID、会话ID、登入IP、登入时间
/// COnlineEvent:用户登入登出记录,包括字段:用户ID、会话ID、登入IP、登入时间、登出时间、在线时长(单位:分钟)
/// 以上为下面代码中用到的一些实体类
/// <summary>
/// 用户在线情况管理
/// </summary>
public static class OnlineManager
{
/// <summary>
/// SessionID对应的在线信息
/// </summary>
private static Dictionary<string, COnlineInfo> _OnlineInfos = new Dictionary<string, COnlineInfo>(); /// <summary>
/// 用户对应的SessionID
/// </summary>
private static Dictionary<string, string> _UserSessions = new Dictionary<string, string>(); private static string _Key = "UserID";
//当服务重启以后把数据库里记录用户在线的信息读取出来
//可以避免服务重启以后用户需要重新登陆
internal static void Start()
{
List<COnlineInfo> onlineInfos = DAL.Account.Account.GetAllOnlineInfos();
if (onlineInfos != null)
{
foreach (COnlineInfo onlineInfo in onlineInfos)
{
_OnlineInfos.Add(onlineInfo.SessionID, onlineInfo);
_UserSessions.Add(onlineInfo.UserID, onlineInfo.SessionID);
}
}
} internal static void Stop()
{
} /// <summary>
/// 登入
/// </summary>
/// <param name="user"></param>
public static bool Login(CUser user)
{
bool isOk = true; try
{
string userID = user.UserID;
HttpContext.Current.Session.Add(_Key, userID);
string sessionID = HttpContext.Current.Session.SessionID; COnlineInfo onlineInfo = new COnlineInfo();
onlineInfo.UserID = userID;
onlineInfo.LoginTime = DateTime.Now;
onlineInfo.IP = "";
onlineInfo.SessionID = sessionID;
_OnlineInfos.Add(sessionID, onlineInfo); _UserSessions.Add(userID, sessionID); //把用户在线的信息存到数据库中
DAL.Account.Account.InsertOnlineInfo(onlineInfo);
}
catch
{
isOk = false;
} return isOk;
} /// <summary>
/// 登出
/// </summary>
/// <param name="user"></param>
public static bool LogOut(CUser user)
{
//string sessionID = HttpContext.Current.Session.SessionID;
HttpContext.Current.Session.Abandon();
HttpContext.Current.Session.Remove(_Key); string userID = user.UserID;
if (_UserSessions.ContainsKey(userID) == false)
return false; bool isOK = false;
string sessionID = _UserSessions[userID];
_UserSessions.Remove(userID);
if (_OnlineInfos.ContainsKey(sessionID) == true)
{
COnlineInfo onlineInfo = _OnlineInfos[sessionID];
COnlineEvent onlineEvent = new COnlineEvent();
onlineEvent.UserID = onlineInfo.UserID;
onlineEvent.SessionID = onlineInfo.SessionID;
onlineEvent.IP = onlineInfo.IP;
onlineEvent.LoginTime = onlineInfo.LoginTime;
onlineEvent.LogoutTime = DateTime.Now;
TimeSpan span = onlineEvent.LogoutTime - onlineEvent.LoginTime;
onlineEvent.OnlineDuration = span.Days * 24 * 60 + span.Hours * 60 + span.Minutes + span.Seconds / Convert.ToDouble(60.0); _OnlineInfos.Remove(sessionID); isOK = DAL.Account.Account.InsertOnlineEvent(onlineEvent);
} return isOK;
} /// <summary>
/// 获取当前的用户
/// </summary>
public static CUser CurrentUser
{
get
{
return GetCurrentUser();
}
} private static CUser GetCurrentUser()
{
string sessionID = HttpContext.Current.Session.SessionID;
if (_OnlineInfos.ContainsKey(sessionID) == false)
return null; COnlineInfo onlineInfo = _OnlineInfos[sessionID];
CUser user = DAL.Account.Account.GetUserByUserID(onlineInfo.UserID);
return user;
}
}
public static class OnlineManager
一个类带有static,意味着什么呢?---简单封装而已,继承、多态与他无关
以前没写过这东西 也没用过session 所以想请各位指点一下
因为是为现在做的项目写的 所以没有更远的考虑 需要的话 以后可以改
以前没写过这东西 也没用过session 所以想请各位指点一下 看看上面的代码用session来实现用户登入登出是否正确 有没有什么问题
谢谢支持