您的位置:首页 > 数据库 > Memcache

Memcache+Cookie替代Session解决方案(MVC版)

2016-01-28 15:12 483 查看
阅读目录

开始

通过IHttpModule注册过滤管道方式

通过BaseController

关于滑动过期

两种方式

回到顶部

通过IHttpModule注册过滤管道方式

具体实现如下:
声明一个类CheckLoginModule.cs它继承自IHttpModule
在请求管道的第9个事件 即获得用户状态的事件中 注册OnRequest事件 判断Memcached中是否存在对应客户端SessionId的用户信息 不存在则意味服务端Session失效
接着判断是否具有保留一周的Cookie(通常网站"记住我一周"的功能) 如果存在 根据Cookie信息获取用户信息 写入Memcached中

假设当用户请求/home/index 页面时 我们要求用户必须登录 即服务端有该用户信息 不存在则跳转至/home/login页面进行登录操作
CheckLoginModule.cs文件内容如下:

using System;
using System.Web.Mvc;
using MvcMamcache.Models;

namespace MvcMamcache.Common {
public class BaseController : Controller {
protected UserInfo LoginUserInfo {
get;
set;
}

protected override void Initialize(System.Web.Routing.RequestContext requestContext) {
base.Initialize(requestContext);
if(requestContext.HttpContext.Request.Cookies["SessionId"] != null) {
string guid = requestContext.HttpContext.Request.Cookies["SessionId"].Value;
object obj = Common.MemCacheHelper.GetValue(guid);//根据Cookie的值从缓存中取出数据.
if(obj != null) {
UserInfo model = obj as UserInfo;
LoginUserInfo = model;
} else {
CheckCookieSevenDay(requestContext);//7天Cookie检验
}
} else {
Response.Redirect("/home/login");
}
}

private void CheckCookieSevenDay(System.Web.Routing.RequestContext requestContext) {
var context = requestContext.HttpContext;
if(context.Request.Cookies["ui1"] == null || context.Request.Cookies["ui2"] == null) {
context.Response.Redirect("/home/login");
} else {
//根据Cookie中保存的用户名与密码至数据库获取UserInfo对象  这里直接new
UserInfo userInfo = new UserInfo() {
LoginId = context.Request.Cookies["ui1"].Value,
LoginPwd = context.Request.Cookies["ui2"].Value
};
var sessionId = Guid.NewGuid().ToString();
context.Response.Cookies["SessionId"].Value = sessionId;
Common.MemCacheHelper.Insert(sessionId, userInfo);
}
}
}
}


View Code
需要用户状态校验的控制器中

using System.Web.Mvc;
using MvcMamcache.Common;

namespace MvcMamcache.Controllers {
public class AdminController : BaseController {
//
// GET: /Admin/

public ActionResult Index() {
ViewBag.UserName = LoginUserInfo.LoginId;
return View();
}

}
}


回到顶部

关于滑动过期

上述第一种方式中我们通过设置了缓存过期时间为20分钟 但这是绝对过期时间 而非滑动过期 若想实现滑动过期也好办 通过Memcached的Replace(key,value,newTimeSpan)来更新失效时间
不在原有代码上调整,这里提供思路如下:

f(Common.MemCacheHelper.GetValue("GetNow") == null) {
Common.MemCacheHelper.Insert("GetNow", DateTime.Now, DateTime.Now.AddMinutes(1));
ViewBag.Msg = "新增时间" + Common.MemCacheHelper.GetValue("GetNow").ToString() + "失效时间应该在:" + ((DateTime)Common.MemCacheHelper.GetValue("GetNow")).AddMinutes(1);
} else {
Common.MemCacheHelper.Replace("GetNow", DateTime.Now, DateTime.Now.AddMinutes(30));
ViewBag.Msg = "替换时间" + Common.MemCacheHelper.GetValue("GetNow").ToString() + "失效时间应该在:" + ((DateTime)Common.MemCacheHelper.GetValue("GetNow")).AddMinutes(30);


当然session的替代方案远不止使用Memcached 还可以通过Nosql非关系型数据库,话说ManagDB的效率相当称赞

点击下载资源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: