Memcache+Cookie替代Session解决方案(MVC版)
阅读目录
通过IHttpModule注册过滤管道方式
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();
} }
}
关于滑动过期
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版)的更多相关文章
- Memcache+cookie实现模拟session
上一片讲到Memcached在Windows上的安装,和用Telnet工具进行命令操作,在稍微了解了原理之后,我也就开始尝试着用程序来对Memcached进行操作.这一篇分为两个部分,第一部分是用.n ...
- 10.Django基础八之cookie和session
一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器 ...
- 【转】Cookie和Session区别和联系详解
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- 理解Cookie和Session机制(转)
目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...
- 关于cookie的文章(cookie与session机制)
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- 理解Cookie和Session机制
转载: 理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录 ...
- cookie 和 session
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- 程序中的Cookie 和Session
这几天回家休息后,想想放假之前的几天,主要看的一些工作上的东西,发现对Session和Cookie这两个东西,我还是很陌生.恩,趁着有网,看了点相关的资料,打算整理下.一翻博客,发现已经有前辈已经对这 ...
- ASP.NET Cookie和Session
Cookie和Session C#在服务器,JS在客户端 客户端验证不能代替服务端验证 Http HTTP属于应用层,HTTP 协议一共有五大特点:1.支持客户/服务器模式;2.简单快速;3.灵活;4 ...
随机推荐
- isset ,empty,is_null 区别
<?php $a = ''; $b = ""; $c = null; $d = array(); $e = ' '; $f = 0; $g = "0"; ...
- PEM文件和private.key文件生成IIS服务器所需的pfx文件(配置SSL用)
第一步:输入域名,点击"创建免费的SSL证书"按钮,如图 第二步:输入邮箱,点击创建,如图 创建成功后,需要进行dns验证,结果图如下: 第三步:在域名所在的云服务器上,添加域名解 ...
- 「小程序JAVA实战」小程序我的个人信息页面开发(41)
转自:https://idig8.com/2018/09/05/xiaochengxujavashizhanxiaochengxuwodegerenxinxiyemiankaifa40/ 已经完成了登 ...
- Windows下安装logstash
1. 下载 https://www.elastic.co/downloads/logstash https://www.elastic.co/downloads/past-releases 2. 文档 ...
- 常用的API接口
主页 :http://api.36wu.com/ GetWeather(实时气象)API 服务地址:http://api.36wu.com/Weather/GetWeather?city=?;如:ht ...
- Redis 主从同步配置
主从功能: 为了防止 Redis 磁盘损坏,导致数据丢失,Redis 提供了复制功能,将一个主数据库的数据自动同步到从数据库,防止数据丢失. 同时还可以配置一主多从来分担主压力,主只接受写的操作,将读 ...
- Android5.0新动画之VectorDrawable
SVG是前端的一套标准,Vector是在Android中使用,他只是实现了SVG语言的Path的标签 Vector的常用语法 M = moveto(M X,Y): 将画笔移动到指定的坐标位置 ...
- Qt + OpenSenceGraph(osg) 加载OSG模型
- "分辨率"到底是个什么概念?它和DPI之间是什么关系?
"分辨率"到底是个什么概念?它和DPI之间是什么关系? 分辨率:显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少.由于屏幕上的点.线和面都是由像素组成的, ...
- 面向对象的JavaScript-009-闭包
引自:https://developer.mozilla.org/cn/docs/Web/JavaScript/Closures 闭包是指能够访问自由变量的函数 (变量在本地使用,但在闭包中定义).换 ...