跨客户端(浏览器)登录,信息同步的解决方案

前几天写过一篇文章专门介绍我之前采用的共享session的解决方案,

但一交付测试,马上发现了致命错误,所以那篇文章也被我删除了尴尬

这两天一直在继续改进这个解决方案,辗转几次,都有问题,直到今天上午,才突然灵光一闪,豁然开朗大笑


之前一直被sessionid这个东西迷惑了,今天突然明白了,既然是以帐号为单位缓存,要跨客户端,那跟sessionid就没有一毛钱的关系了,干嘛还要用他呢。。。。

于是新的解决方案迅速诞生了,而且很快通过了测试。

现把关键代码摘录如下:

#region 封装的登录信息属性方法
private Account user { get; set; }
public Account UserInfo
{
    get 
    {
        if (user == null)
        {
            user = MyCache.GetCache("UserInfo") as Account;
        }
        return user;
    }
    set 
    {
     user = value;
        MyCache.SetCache("UserInfo", user, 15);
    }
}
#endregion

#region 登录方法里登录成功后,共享信息的共享处理
var user = re.Data as Account; //这是根据登录帐号密码查询到的帐号信息对象
var obj = MyCache.GetCache("UserInfo") as Account; //共享缓存里取登录信息对象
user = obj == null ? user : obj;
Session["AccountCode"] = user.AccountCode;
UserInfo = user; //缓存用户信息,这里是封装的一个属性方法里处理
#endregion

#region 修改密码方法里,修改成功后的共享信息清除处理
MyCache.ClearCache();   //置空用户缓存
Session.Clear();        //置空Session
#endregion

#region 登录验证方法,验证是否已经登录
var user = MyCache.GetCache("UserInfo") as Account;
if (user == null)
{//未登陆
   // do something...
}
#endregion

#region MyCache工具类 处理逻辑
/// <summary>
/// 获取缓存
/// </summary>
/// <param name="key">缓存key</param>
/// <returns>缓存对象</returns>
public static Dictionary<string, object> GetOwnerCache()
{
    var id = HttpContext.Current.Session["AccountCode"] as string;
    return string.IsNullOrWhiteSpace(id) ? null : HttpRuntime.Cache.Get(id) as Dictionary<string, object>;
}
public static object GetCache(string key)
{
    var dict = GetOwnerCache();
    return dict == null ? null : dict.ContainsKey(key) ? dict[key] : null;
}
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="key">缓存key</param>
/// <param name="obj">缓存对象</param>
/// <param name="expire">过期时间(分钟),添null表示取默认值</param>
public static void SetCache(string key, object obj, int? expire)
{
    var id = HttpContext.Current.Session["AccountCode"] as string;
    if (!string.IsNullOrWhiteSpace(id))
    {
        var dict = HttpRuntime.Cache.Get(id) as Dictionary<string, object>;
        if (dict == null)
        {
            dict = new Dictionary<string, object>();
            dict.Add(key, obj);
            HttpRuntime.Cache.Add(id, dict, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, expire ?? 15, 0), CacheItemPriority.Default, null);
        }
        else
        {
            if (dict.ContainsKey(key))
            {
                dict[key] = obj;
            }
            else
            {
                dict.Add(key, obj);
            }
        }
    }
}
/// <summary>
/// 删除缓存
/// </summary>
/// <param name="key">缓存key</param>
public static void DeleteCache(string key)
{
    var dict = GetOwnerCache();
    if (dict != null && dict.ContainsKey(key))
    {
        dict.Remove(key);
    }
}
/// <summary>
/// 清空当前用户缓存
/// </summary>
public static void ClearCache()
{
    var id = HttpContext.Current.Session["AccountCode"] as string;
    if (!string.IsNullOrWhiteSpace(id))
    {
        var dict = HttpRuntime.Cache.Get(id) as Dictionary<string, object>;
        if (dict != null)
        {
            HttpRuntime.Cache.Remove(id);
        }
    }
}
#endregion

这套方案应该算是非常简单可行的方法,这里还是用到了session,但session的用途仅限于记录登录用户的帐号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值