阅读目录

两种方式

通过IHttpModule注册过滤管道方式

具体实现如下:
声明一个类CheckLoginModule.cs它继承自IHttpModule
在请求管道的第9个事件 即获得用户状态的事件中 注册OnRequest事件  判断Memcached中是否存在对应客户端SessionId的用户信息  不存在则意味服务端Session失效
接着判断是否具有保留一周的Cookie(通常网站"记住我一周"的功能) 如果存在 根据Cookie信息获取用户信息 写入Memcached中
 
假设当用户请求/home/index 页面时 我们要求用户必须登录 即服务端有该用户信息 不存在则跳转至/home/login页面进行登录操作

CheckLoginModule.cs文件内容如下:

using System;
using System.Web;
using MvcMamcache.Models; namespace MvcMamcache.Common {
public class CheckLoginModule : IHttpModule {
#region IHttpModule 成员 public void Init(HttpApplication context) {
context.AcquireRequestState += new EventHandler(OnRequest);
} public void OnRequest(object source, EventArgs e) {
HttpApplication application = source as HttpApplication;//得到Application
HttpContext context = application.Context;//得到请求上下文.
Uri url = context.Request.Url;//得到当前请求的URL if(url.AbsolutePath.ToLower() == "/home/index") {
var httpCookie = context.Request.Cookies["SessionId"];
if(httpCookie == null || Common.MemCacheHelper.GetValue(httpCookie.Value) == null) {//Session会话过期
//是否保留7天
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);
}
}
}
} public void Dispose() {
throw new NotImplementedException();
}
#endregion
}
}

需要将此过滤Module在Web.Config文件中进行配置

      <httpModules>
<add name="CheckLoginModule"
type="MvcMamcache.Common.CheckLoginModule"/>
</httpModules>

Home控制器中Index与Login方法的调整

回到顶部

通过BaseController

自定义的父类控制器  它继承自Controller 在控制器Initialize中 进行校验  并声明LoginUserInfo属性保存用户信息供所有子Controller使用

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);
}
}
}
}

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

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());
ViewBag.Msg = "新增时间" + Common.MemCacheHelper.GetValue("GetNow").ToString() + "失效时间应该在:" + ((DateTime)Common.MemCacheHelper.GetValue("GetNow")).AddMinutes();
} else {
Common.MemCacheHelper.Replace("GetNow", DateTime.Now, DateTime.Now.AddMinutes());
ViewBag.Msg = "替换时间" + Common.MemCacheHelper.GetValue("GetNow").ToString() + "失效时间应该在:" + ((DateTime)Common.MemCacheHelper.GetValue("GetNow")).AddMinutes();

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

点击下载资源

Memcache+Cookie替代Session解决方案(MVC版)的更多相关文章

  1. Memcache+cookie实现模拟session

    上一片讲到Memcached在Windows上的安装,和用Telnet工具进行命令操作,在稍微了解了原理之后,我也就开始尝试着用程序来对Memcached进行操作.这一篇分为两个部分,第一部分是用.n ...

  2. 10.Django基础八之cookie和session

    一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器 ...

  3. 【转】Cookie和Session区别和联系详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  4. 理解Cookie和Session机制(转)

    目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...

  5. 关于cookie的文章(cookie与session机制)

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  6. 理解Cookie和Session机制

    转载: 理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录 ...

  7. cookie 和 session

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  8. 程序中的Cookie 和Session

    这几天回家休息后,想想放假之前的几天,主要看的一些工作上的东西,发现对Session和Cookie这两个东西,我还是很陌生.恩,趁着有网,看了点相关的资料,打算整理下.一翻博客,发现已经有前辈已经对这 ...

  9. ASP.NET Cookie和Session

    Cookie和Session C#在服务器,JS在客户端 客户端验证不能代替服务端验证 Http HTTP属于应用层,HTTP 协议一共有五大特点:1.支持客户/服务器模式;2.简单快速;3.灵活;4 ...

随机推荐

  1. json data 解析demo

    json data: demo: JsonObject jsonObject= JsonHandle.getAsJsonObject(city_dataInfo).get("data&quo ...

  2. java 堆、栈、常量池等

    寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 ...

  3. 检测python进程是否存活

    crontab -e */ * * * * /data/log_realtime/check.sh > /data/log_realtime/check.log >& * * /d ...

  4. ubuntu用户添加adduser, useradd并给予sudo权限

    ubuntu用户添加adduser, useradd并给予sudo权限 2016-06-15 10:36 1286人阅读 评论(0) 收藏 举报  分类: Ubuntu(80)  ubuntu和win ...

  5. Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡

    转载:http://blog.csdn.net/congcong68/article/details/41113239 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架 ...

  6. 解读linux中用户密码规则及忘记root口令的破解(思路)

    linux当中,用户名和密码表对应关系放在/etc/passwd中,如: root:x:0:0:root:/root:/bin/bash 格式代表意义分别为 用户名:密码:用户id:组id:用户描述 ...

  7. 如何安装和使用Karma-Jasmine

    注意:本文中出现的资料链接.karma的插件安装等,均可能需要翻$墙后才能正确执行. Jasmine是一个JavaScript的测试工具,在Karma上运行Jasmine可完成Javascript的自 ...

  8. js 的eval()方法 计算某个字符串,并执行其中的的 JavaScript 代码;

    定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 Java ...

  9. input子系统分析之三:驱动模块

    内核版本:3.9.5 本节将以even handler来分析设备的注册和打开的过程,分析之前不妨回顾一下上节介绍的数据结构. 结合前两节分析可知,input子系统分为3层,最上一层是event han ...

  10. 201671010140. 2016-2017-2 《Java程序设计》java学习第十一周

     java学习第十一周     本周,进行了java集合方面的知识,在博客园的帮助下,我的课前预习更有条理性,重点明确,本周的课堂反应明显更好了,首先,梳理一下本周知识点.  Collection   ...