学习笔记48_Memcache跟用户登录模块结合
public interface ICacheWriter
{
void AddCache(string key,object value, DateTime expDate);
void AddCache(string key,object value);
object GetCache(string key);
T GetCache<T>(string key);
void SetCache(string key,object value,DateTime extDate);
void SetCache(string key,object value);
}
//实现一:
public class HttpRuntimeCacheWritter : ICacheWriter
{
public void AddCache(string key,object value,DataTime expDate)
{
HttpRuntime.Cache.Insert(key,value,null,expDate,TimeSpan.Zero);
}
public void AddCache(string key,object value)
{
HttpRuntime.Cache.Insert(key,value);
}
public object GetCache(string key)
{
HttpRuntime.Cache[Key];
}
public T GetCache<T> (string key )
{
return (T)HttpRuntime.cache[Key];
}
public void SetCache(string key,object value,DateTime extDate)
{
HttpRuntime.Cache.Remove(key);
AddCache(key,value,extDate);
}
public void SetCache(string key,object value)
{
HttpRuntime.Cache.Remove(key);
AddCache(key,value);
}
}
//实现二:
可以在Web.config中,配置可以连接那些服务器:
//
<configuration>
<appSettings>
<add key= "MemcachedServerList" value="192.168.1.100:11211,192.168.1.118:11211"/>
</appSettings>
</configuration>
//
public class MemCacheWritter : ICacheWriter
{
private MemCachedClient memcachedClient;
//
public MemcacheWritter()
{
// 分布Memcachedf服务IP 端口
//string[] servers = {"192.168.1.100:11211","192.168.1.118:11211"};//意思是可以将数据放到两台电脑当中
string[] servers = System.configuration.ConfigurationManager.AppSettings["MemcachedServerList"].Split(",")
//初始化池
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(servers);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenancelSleep = 30;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize();
//客户端实例化
memcachedClient = new MemcacheClient();
mc.EnableCompression = false;
mc.Add("keyddd","sssssssssss"); //进行哈希算法,以决定存到哪台机器上
}
//
public void AddCache(string key,object value,DataTime expDate)
{
//注意,传入的value是要有标记为[Serialzable]的
memcachedClient.Add(key,value,expDate);
}
public void AddCache(string key,object value)
{
memcachedClient.Add(key,value);
}
public object GetCache(string key)
{
memcacheClient.Get(key);
}
public T GetCache<T> (string key )
{
return (T)memcacheClient.Get(key);
}
public void SetCache(string key,object value,DateTime extDate)
{
memcacheClient.Set(key,value,extDate);
}
public void SetCache(string key,object value)
{
memcahce.set(key,value);
}
}
*************************************************分割线**********************************************************
//此类事用来提供ICacheWriter具体类以及其方法
publc class CacheHelper
{
// 这里可以使用Spring 来注入
public static ICacheWritter CacheWritter {get;set;}
//静态构造函数只会执行一次
static CacheHelper()
{
//在String.core.dll中
Spring.Context.IApplicationContext ctx = ContextRegistry.GetContext();
//此处不是为了获得CacheHelper对象,而是为了在实例化对象的时候,顺便
根据<property name="CacheWriter" ref="CacheWriter"/>来设置CacheWriter
ctx.GetObject("CacheHelper");
//也能
//CacheWriter = ctx.GetObject("CacheWriter") as ICacheWritter;
}
//
public statci void AddCache(string key,object value,DataTime expDate)
{
//往缓存写:单机,分布式,修改一下配置,就能切换
}
public static void AddCache(string key,object value)
{
}
public static object GetCache(string key)
{
}
public void SetCache(string key,object value,DateTime extDate)
{
....
}
public void SetCache(string key,object value)
{
.....
}
}
//Spring注入,在common.xml
<objects xmlns="...">
<!--使用单机模式--->
<!--<objcet name="CacheWriter" type = "xxxx.xxx.HttpRuntimeCacheWritter(类全名),XXX.XXX.XXX(程序集名)" singleton="false"></object>-->
<!--使用memcahced分布式缓存--->
<objcet name="CacheWriter(对应下面的ref)" type = "xxxx.xxx.MemcahcedWritter(类全名),XXX.XXX.XXX(程序集 名)" singleton="false"></object>
<!--对CacheHelper进行属性值注入,此处CacheWriter就是CacheHelper的属性-->
<object name="CacheHelper" type=xxxx.xxx.CacheHelper,xxx.xxx>
<property name="CacheWriter" ref="CacheWriter(对应上面的name)"/>
</object>
</objects>
//Web.config中
<configuration>
<!--Spring.Net配置节点-->
<Spring>
<context>
<resoruce url="file://~/config/common.xml"/> <!--放到第一行,是因为后边的配置文件要用到它-->
<resoruce url="file://~/config/其他配置文件.xml"/>
</context>
</Spring>
</configuration>
***************************************************分割线**********************************************************
// 登录控制器
public AciontResult ProcessLogin()//此处可以定义一个ViewMode来接收,单是ViewMode的属性名,应该和html控件的name一致
{
//处理验证码
string strCode= Request["控件name"];
string sessionCode = Session["VCode"] as string;
Session["VCode"] = null;//**验证码取一次就应该让其为null
if(string.IsNullOrEmpty|| sessionCode!=null )
{
return Content("验证码错误");//返回这串,给前台在html标签中显示
}
//处理用户名密码
string uid = Request["LoginCode"];
string pwd = Request["LoginPwd"];
//var userinfo = Service.GetEntities(u=>u.uid==uid&&u.pwd==pwd).FirstOrDefault();
**不用EF也行,反正要获取到实例
//if(userinfo==null)
//{
//return Content("密码错误");//返回这串,给前台在html标签中显示
//}
//session["LoginUser"] = userinfo;//是使用session来记录会话状态
改为:
var guid = Guid.NewGuid();
CacheHelper .AddCache(guid ,userinfo,DataTime.Now.AddMinutes(20));//20分钟过期
//
Respose.Cookie.add(new cookie("UserLoginId",Guid));
//如果正确那么跳转到首页
return Content("ok");//后台不要直接使得页面重定向,为了接口通用性,以及前台逻辑问题
//上边是返回 Content(""),这里应该也是返回Content("")
}
***************************************************分割线**********************************************************
public class BaseController:Controller//本来
{
protected bool needCheck=true;
protected UserInfo currentUser{get;set;}
protect override void OnActionExecuting(ActionExecutingContext filterContext)
{
//在当前的控制器里面所有的方法执行之前,都先执行此代码
base.OnActionExecuting(filterContext);
//跟上面的LoginCheckFilterAttribute的代码
if(needCheck==false) return;
//检验用户是否登录
currentUser = filterContext.HttpContext.Session["LoginUser"] as UserInfo;
//这里使用
string userGuid = Request.Cookies["UserLoginId"].value;
currentUser = CacheHelper.Get("userGuid") as UserInfo;
if( currentUser ==null)
{
filterContext.HttpContext.Respone.Redirect("/UserLogin/Login");
}
else
{
//过期时间更新
CacheHelper.Set("LoginUser",currentUser,DataTime.Now.AddMinutes(20));
}
}
}
学习笔记48_Memcache跟用户登录模块结合的更多相关文章
- Spring MVC学习笔记——完整的用户登录
1.搭建环境的第一步是导包,把下面这些包都导入工程中 /media/common/工作/Ubuntu软件/SpringMVC_jar包整理/aop/media/common/工作/Ubuntu软件/S ...
- Java SSH框架系列:用户登录模块的设计与实现思路
1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...
- [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设
[HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设 敲黑板!! <q>元素添加短引用,<blockquote>添加长引用 在段落里添加引用就使用< ...
- Bash脚本编程学习笔记05:用户交互与脚本调试
用户交互 在<学习笔记04>中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式.还有一种方式,是read命令. [root@c7-server ~]# read name alo ...
- Java基础知识强化之集合框架笔记37:用户登录注册案例
1. 登录注册案例分析图解: 2. 用户登录案例 详细分析 和 分包实现: (1)用户登录案例详细分析(面向对象思想) 按照如下的操作,可以让我们更符合面向对象思想: • 有哪些类呢? ...
- oracle学习笔记一:用户管理(1)简单的命令
1,打开操作界面 我们在安装好oracle后可以在两个地方打开要操作的界面.请看图一: 或者在运行窗口输入sqlplus.其实这里也是调用了bin下面的sqlplus.exe. 在打开dos命令行窗口 ...
- Window上python开发--4.Django的用户登录模块User
Android系统开发交流群:484966421 OSHome. 微信公众号:oshome2015 在搭建站点和web的应用程序时,用户的登录和管理是差点儿是每一个站点都必备的. 今天主要从一个实例了 ...
- 华为云计算IE面试笔记-桌面云用户登录连接流程及故障处理?
1-10:桌面与系统验证成功 http协议 11-19:桌面list(VM列表)获取,选择 http协议 20-30: ...
- 项目开发-->身份认证及用户登录模块
1.首先明确的两个问题 如何判断当前申请是由一个已登录用户发起的?如果Request.IsAuthenticated为true,则表示是一个已登录用户. 如何获取当前登录用户的登录名?如果是一个已登录 ...
随机推荐
- css 添加手状样式,鼠标移上去变小手
cursor:pointer, 简单实用. 前端工作一年多,竟然没有博客.说出来别人都要笑话,这是一个新的开始.
- js 验证数据类型的4中方法
1.typeof 可以检验基本数据类型 但是引用数据类型(复杂数据类型)无用: 总结 : typeof 无法识别引用数据类型 包括 bull; 2.instanceof是一个二元运算符,左操作数 ...
- Web应用程序并发问题处理的一点小经验
在web应用中,一个账户,会有N多个涉及到数字的字段.比如一个账户的金额,积分等.这些字段就涉及到增减的情况.如果是在测试环境下,靠程序员或者测试手动点击.一般是发现不了问题. 一旦上到正式环境下.有 ...
- Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)
Hbase的客户端有原生java客户端,Hbase Shell,Thrift,Rest,Mapreduce,WebUI等等. 下面是这几种客户端的常见用法. 一.原生Java客户端 原生java客户端 ...
- 解决MVC中Model上的特性在EF框架刷新时清空的问题
MVC中关于前端数据的效验一般都是通过在Model中相关的类上打上特性来实现. 但是在我们数据库发生改变,EF框架需要刷新时会把我们在Model上的特性全部清除,这样的话,我们前端的验证就会失效. 因 ...
- C# 8 - Range 和 Index(范围和索引)
C# 7 的 Span C# 7 里面出现了Span这个数据类型,它可以表示另一个数据结构里连续相邻的一串数据,并且它是内存安全的. 例子: 这个图的输出是3,4,5,6. C# 8 的Range类型 ...
- ThoughtWorks 面试三连挂,以后再也不去了
先说我吧,之前在外企呆过两年,那时Team的很多同事都去了ThoughtWorks,所以有一种情怀,只要有机会我就去面试...之前在Team里对我的评价也很高(不是我说的),现在也是公司的技术总监,总 ...
- Java的数组的作业11月06日
动手动脑 实验一:了解for循环得到棋盘结构 (1) 程序: import java.io.*; public class QiPan { //定义一个二维数组来充当棋盘 private String ...
- 声学回声消除(Acoustic Echo Cancellation)
回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声.一些回声是必要的,比如剧院里的音乐回声以及延迟时间较短的房间回声:而大多数回声会造成负面影响,比如在有线或者无线通信时重复听到自 ...
- 禅道部署(基于Linux)
部署步骤: 1. 查看Linux服务器是32位还是64位的 #getconf LONG_BIT 2. 禅道开源版安装包下载 下载站点1:#wget http://sourceforge.net/ ...