阅读目录

两种方式

通过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. 分享Axure RP8.0激活码一份

    用户名:aaa 注册码:2GQrt5XHYY7SBK/4b22Gm4Dh8alaR0/0k3gEN5h7FkVPIn8oG3uphlOeytIajxGU

  2. curl_setopt设置发送cookie信息

    1.php curl访问会话传递问题 curl_setopt($ch , CURLOPT_COOKIE , 'PHPSESSID=A7281E0926CB37D791AD464CDD646CF2') ...

  3. openssh 在32位、64位操作系统上的安装配置

    openssh是安装在windows系统上的提供SSH服务的服务端软件,可以提供安全的命令行远程连接管理.下面介绍下openssh成功安装使用的操作步骤. 工具/原料   openssh window ...

  4. Spring实战之通过XML装配bean

    尽管Spring长期以来确实与XML有着关联,但现在需要明确的是,XML不再是配置Spring的唯一可选方案.Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了. ...

  5. mongodb(五)

    mongoDB 启动配置祥讲导出,导入,运行时备份Fsync锁,数据修复用户管理,安全认证 1.启动项 mongod --help 1.1利用config配置文件来启动数据库改变端口为8888 mon ...

  6. 微信小程序中this关键字使用技巧

    转自:https://blog.csdn.net/qq_33956478/article/details/81348453 微信小程序中,在wx.request({});方法调用成功或者失败之后,有时 ...

  7. javax.persistence.TransactionRequiredException: No transactional EntityManager available

    在操作中加上@Transcational注解,一般是用于修改或者删除操作.

  8. APP微信登录---第三方登录

    (一)引入maven配置 <dependency> <groupId>com.github.liyiorg</groupId> <artifactId> ...

  9. Gym101128G:Game of Cards

    题意: 有P摞纸牌和一个数字k,每次可以从一摞中拿0-k张牌,拿完再剩下的牌中的第一张数字是几,就必须再拿几张,谁不能拿谁输. emmm感觉好像就是裸的SG游戏啊,数据不大,递推出每一摞牌的SG值,然 ...

  10. unity3d xml序列化

    using UnityEngine; using System.Collections; using System.Xml; using System.Xml.Serialization; using ...