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跟用户登录模块结合的更多相关文章

  1. Spring MVC学习笔记——完整的用户登录

    1.搭建环境的第一步是导包,把下面这些包都导入工程中 /media/common/工作/Ubuntu软件/SpringMVC_jar包整理/aop/media/common/工作/Ubuntu软件/S ...

  2. Java SSH框架系列:用户登录模块的设计与实现思路

    1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...

  3. [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设

    [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设 敲黑板!! <q>元素添加短引用,<blockquote>添加长引用 在段落里添加引用就使用< ...

  4. Bash脚本编程学习笔记05:用户交互与脚本调试

    用户交互 在<学习笔记04>中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式.还有一种方式,是read命令. [root@c7-server ~]# read name alo ...

  5. Java基础知识强化之集合框架笔记37:用户登录注册案例

    1. 登录注册案例分析图解: 2. 用户登录案例 详细分析 和 分包实现: (1)用户登录案例详细分析(面向对象思想) 按照如下的操作,可以让我们更符合面向对象思想: • 有哪些类呢?         ...

  6. oracle学习笔记一:用户管理(1)简单的命令

    1,打开操作界面 我们在安装好oracle后可以在两个地方打开要操作的界面.请看图一: 或者在运行窗口输入sqlplus.其实这里也是调用了bin下面的sqlplus.exe. 在打开dos命令行窗口 ...

  7. Window上python开发--4.Django的用户登录模块User

    Android系统开发交流群:484966421 OSHome. 微信公众号:oshome2015 在搭建站点和web的应用程序时,用户的登录和管理是差点儿是每一个站点都必备的. 今天主要从一个实例了 ...

  8. 华为云计算IE面试笔记-桌面云用户登录连接流程及故障处理?

    1-10:桌面与系统验证成功                           http协议 11-19:桌面list(VM列表)获取,选择                http协议 20-30: ...

  9. 项目开发-->身份认证及用户登录模块

    1.首先明确的两个问题 如何判断当前申请是由一个已登录用户发起的?如果Request.IsAuthenticated为true,则表示是一个已登录用户. 如何获取当前登录用户的登录名?如果是一个已登录 ...

随机推荐

  1. linux系统下使用xampp 丢失mysql root密码 只能远程访问,本地无法连接数据库

    如果在ubuntu 下面 使用xampp这个集成开发环境,却忘记mysql密码. 当出现只能远程访问的,本地无法访问,通常是host改成% 远程访问,本地访问到一个是空壳.这是权限的问题 需要修hos ...

  2. pyinstaller 打包exe程序读不到配置文件No such file

    挺久没更新博客的,一来之前是觉得才疏学浅,记录下来的太简单没人看.二来时间上不是很充裕(不是借口,有时间打游戏,没时间总结) 偶然有一次发现同事在搜索解决问题的时候正在看我博客的解决思路,很奇妙的感觉 ...

  3. Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现

    Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现 一.漏洞描述 Joomla是一套内容管理系统,是使用PHP语言加上MYSQL数据库所开发的软件系统,最新版本为3.9.12,官网: ...

  4. 【Tomcat】tomcat7 设置成系统服务启动

    1.启动cmd 2.cd C:\Program Files\tomcat7\bin 3.service.bat install 4.打开tomcat7w.exe可以启动管理服务

  5. 使用Newspaper3k框架快速抓取文章信息

    一.框架介绍 Newspaper是一个python3库,但是Newspaper框架并不适用于实际工程类新闻信息爬取工作,框架不稳定,爬取过程中会有各种bug,例如获取不到url.新闻信息等,但对于想获 ...

  6. Linux入门(磁盘与挂载)

    Linux入门之 磁盘管理与挂载   在我们使用计算机或者是服务器时,总会需要接入外部存储的时候,正如我们使用的移动硬盘.U盘.接入手机等,就是一个接入外部存储的过程.上述这些在接入Windows时我 ...

  7. UWP开发入门(二十四)—— Win10风格的打印对话框

    虽然经常看到阿迪王发“看那个开发UWP的又上吊了”的图……还是忍不住重启一下这个系列.最近有用到UWP的print API,特地来写一篇给某软的这个伟大构想续一秒. 之前的打印对话框差不多长成这样: ...

  8. 线程封闭之栈封闭和ThreadLocal

    线程封闭 在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式. 1.栈封闭 所谓的栈封闭其 ...

  9. 域渗透-Kerberos协议中spn的应用

    0x01 关于SPN 服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称. 服务主体名称是服务实例(可以理解为一个服务,比如 HTTP.MSSQL ...

  10. Powshell之基础语法

    记录一下关于Powershell的基础语法 变量 变量都是以$开头, 是强类型语言, 语言是大小写不敏感的 提一提变量保护与常量的声明:New-Variable num -Value -Force - ...