Memcache+Cookie替代Session解决方案(MVC版)
2016-01-28 15:12
483 查看
阅读目录
开始
通过IHttpModule注册过滤管道方式
通过BaseController
关于滑动过期
两种方式
回到顶部
声明一个类CheckLoginModule.cs它继承自IHttpModule
在请求管道的第9个事件 即获得用户状态的事件中 注册OnRequest事件 判断Memcached中是否存在对应客户端SessionId的用户信息 不存在则意味服务端Session失效
接着判断是否具有保留一周的Cookie(通常网站"记住我一周"的功能) 如果存在 根据Cookie信息获取用户信息 写入Memcached中
假设当用户请求/home/index 页面时 我们要求用户必须登录 即服务端有该用户信息 不存在则跳转至/home/login页面进行登录操作
CheckLoginModule.cs文件内容如下:
View Code
需要用户状态校验的控制器中
回到顶部
不在原有代码上调整,这里提供思路如下:
当然session的替代方案远不止使用Memcached 还可以通过Nosql非关系型数据库,话说ManagDB的效率相当称赞
点击下载资源
开始
通过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的效率相当称赞
点击下载资源
相关文章推荐
- 详解memcached原理
- magent代理memcached 版本兼容问题
- memcache的一致性hash算法使用
- 实例讲解分布式缓存软件Memcached的Java客户端使用
- Memcached, Redis, MongoDB区别
- 详解MemCached原理
- Java之XMemcached使用及源码详解
- nginx+php(包含mcrypt bcmath zendguardloader mysqli memcached redis扩展)安装配置手册
- 如何用redis/memcache做Mysql缓存层
- 分布式缓存系统Memcached简介与以及在.net下的实践(转)
- spring+memcache配置方式
- PHP监測memcache服务端的执行状况
- Memcached分布式原理
- 关于使用memcached提高并发的文章,很有用
- memcached的工作原理
- [置顶] PHP memcache扩展安装,memcahed服务器安装,项目上运用memcahed
- Redis与Memcached的区别与简介
- 第七章 Xmemcached客户端介绍
- PHP内存缓存功能memcached
- linux下安装memcache