控制器-〉方法过滤器-〉controller-> 方法

所以通过建立controller基类的方法进行方法过滤,所有控制器先执行基类的OnActionExecuting 方法。

using Spring.Context;
using Spring.Context.Support;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace Eco.Web.App.Controllers
{
public class BaseController : Controller
{
//
// GET: /Base/
public UserInfo LoginUser { get; set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
bool isExt = false;
// if (Session["userInfo"] == null)
if (Request.Cookies["sessionId"]!=null)
{
string sessionId = Request.Cookies["sessionId"].Value;//接收从Cookie中传递过来的Memcache的key
object obj= Common.MemcacheHelper.Get(sessionId);//根据key从Memcache中获取用户的信息
if (obj != null)
{
UserInfo userInfo = Common.SerializerHelper.DeserializeToObject<UserInfo>(obj.ToString());
LoginUser = userInfo;
isExt = true;
//Common.MemcacheHelper.Set(sessionId, obj.ToString(), DateTime.Now.AddMinutes(20));//模拟滑动过期时间
if (LoginUser.UName == "itcast")
{
return;
} //完成权限过滤.
string actionUrl = Request.Url.AbsolutePath.ToLower();//请求地址。
string actionHttpMethod = Request.HttpMethod;//请求方式
IApplicationContext ctx = ContextRegistry.GetContext();
IUserInfoService UserInfoService = (IUserInfoService)ctx.GetObject("UserInfoService");
IActionInfoService ActionInfoService = (IActionInfoService)ctx.GetObject("ActionInfoService");
var actionInfo= ActionInfoService.LoadEntities(a=>a.Url==actionUrl&&a.HttpMethod==actionHttpMethod).FirstOrDefault();
if (actionInfo == null)
{
Response.Redirect("/Error.html");
return;
} //判断登录用是否有权限访问
//按照第2条进行判断
var loginUserInfo = UserInfoService.LoadEntities(u => u.ID == LoginUser.ID).FirstOrDefault();
var r_UserInfo_actionInfo =( from a in loginUserInfo.R_UserInfo_ActionInfo
where a.ActionInfoID == actionInfo.ID
select a).FirstOrDefault();
if (r_UserInfo_actionInfo != null)
{
if (r_UserInfo_actionInfo.IsPass == true)
{
return;
}
else
{
Response.Redirect("/Error.html");
return;
}
}
//按照第1条线进行过滤(用户---角色--权限)
var loginUserRoleInfo = loginUserInfo.RoleInfo;
var loginUserCountAction=(from r in loginUserRoleInfo
from a in r.ActionInfo
where a.ID==actionInfo.ID
select a
).Count();
if (loginUserCountAction < )
{
Response.Redirect("/Error.html");
return;
} } }
if (!isExt)
{
filterContext.HttpContext.Response.Redirect("/Login/Index");
return;
} } }
}

controller基类

http://www.cnblogs.com/jaxu/p/5196811.html  memcache  http://www.cnblogs.com/knowledgesea/p/4940713.html

客户端添加

Commons.dll、ICSharpCode.SharpZipLib.dll、Memcached.ClientLibrary.dll引用

建立memcacheHelper辅助类

将地址写到Web.config文件中

string[] serverlist = { "127.0.0.1:11211", "10.0.0.132:11211" };

建立序列化(JSON)SerializerHelper类,缓存对象.用json.net开源项目序列化对象  VS已经集成到MVC中,不用在MVC项目中引入包,但在非MVC项目中需要引入包(在MVC packages中找),如COMMON项目中要引入

通过向Cookies存入sessionId 来存、取session,只要浏览器不关闭就可以取出

string sessionId =Guid.NewGuid().ToString();//作为Memcache的key
Common.MemcacheHelper.Set(sessionId,Common.SerializerHelper.SerializeToString(userInfo), DateTime.Now.AddMinutes(20));//使用Memcache代替Session解决数据在不同Web服务器之间共享的问题。
Response.Cookies["sessionId"].Value = sessionId;//将Memcache的key以cookie的形式返回到浏览器端的内存中,当用户再次请求其它的页面请求报文中会以Cookie将该值再次发送服务端。

....................

if (Request.Cookies["sessionId"]!=null)
{
string sessionId = Request.Cookies["sessionId"].Value;//接收从Cookie中传递过来的Memcache的key
object obj= Common.MemcacheHelper.Get(sessionId);//根据key从Memcache中获取用户的信息

-------------------------------------------------------------------------------------------------------------------------------------

方法过滤器,分布式缓存 Memcached实现Session解决方案的更多相关文章

  1. CYQ.Data V5 分布式缓存MemCached应用开发介绍

    前言 今天大伙还在热议关于.NET Core的东西,我只想说一句:在.NET 跨平台叫了这么多年间,其实人们期待的是一个知名的跨平台案例,而不是一堆能跨平台的消息. 好,回头说说框架: 在框架完成数据 ...

  2. 分布式缓存Memcached/memcached/memcache详解及区别

    先来解释下标题中的三种写法:首字母大写的Memcached,指的是Memcached服务器,就是独立运行Memcached的后台服务器,用于存储缓存数据的“容器”.memcached和memcache ...

  3. .NET分布式缓存Memcached从入门到实战

    一.课程介绍 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是 ...

  4. NET分布式缓存Memcached测试体验

    原文地址:http://onlyonewt.blog.sohu.com/160168896.html 一直在学习关注大访问量网站的缓存是如何实现,之前看过Memcached的资料,忙于没有时间来真正测 ...

  5. 第八章 企业项目开发--分布式缓存memcached

    注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存 ...

  6. 分布式缓存Memcached

       分布式缓存服务器,既然用到数据缓存很明显就是想高效性的获取数据,大容量的存储数据.为了可以缓存大量的数据以及可以高效获取数据,那么分布式缓存数据库就要解决数据可以水平线性扩展,这样可以扩大数据容 ...

  7. 分布式缓存-Memcached

    分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大 并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性).分布式缓存的核心技术包括首先是内存本身的管理问题,包括 ...

  8. C# Azure 存储-分布式缓存Redis在session中的配置

    1. 开始 对于分布式的缓存,平常的session的处理是一个用户对应一台分布式的机器,如果这台机器中途挂机或者不能处理这个用户session的情况发生,则此用户的session会丢失,会发生不可预知 ...

  9. 分布式缓存memcached介绍,win7环境安装,常用命令set,get,delete,stats, java访问

    一.memcached是什么? 二.memcached不互相通信的分布式 三.安装步骤 四.本文介绍的命令主要包括: 存入命令(Storage commands) 取回命令(Retrieval com ...

随机推荐

  1. asp.net 网站开发流程总结

    由于这学期要做asp.net的网站开发,导师让我们在前期做详细的计划说明,时间安排.由于网站开发流程不知道,以及需要学什么指示都是盲懂,所以计划安排需在了解大致流程之后才能做出来,一下是询问同学和在网 ...

  2. [CareerCup] 17.4 Maximum of Two Numbers 两数中的较大值

    17.4 Write a method which finds the maximum of two numbers. You should not use if-else or any other ...

  3. AJAX回调(调用后台方法返回数据)

    记得先要导入jquery.js. 格式一 $.ajax({"Key1":"value1","key2":"value2" ...

  4. java类加载器的层次结构

    类加载器的层次结构: 引导类加载器(bootstrap class loader) 用来加载java的核心库(JAVA_HOME/jre/lib/rt.jar,或sun.boot.class.path ...

  5. 【iCore3 双核心板】例程二十七:DMA LAN实验——高速数据传输测速

    实验指导书及代码包下载: http://pan.baidu.com/s/1o7qnCUI iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  6. 【iCore3 双核心板】例程三十二:UART_IAP_ARM实验——更新升级STM32

    实验指导书及代码包下载: http://pan.baidu.com/s/1hrnLJwC iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  7. 【iCore3 双核心板_ uC/OS-III】例程六:信号量——共享资源

    实验指导书及代码包下载: http://pan.baidu.com/s/1milKoVA iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  8. mysql5.5手册读书日记(2)

    <?php /* * * MySQL_5.5中文参考手册 485开始 * * mysql> SELECT CASE 1 WHEN 1 THEN 'one' -> WHEN 2 THE ...

  9. 实现服务器端与客户端的实时通信 SignalR(1)

    一.本文出处:SignalR 实例介绍 (建议看原著里面有DEMO下载) 二.这篇文章介绍如何利用 VS2012 创建一个简单的实时聊天系统,建好后的样子如下(模拟三个在线用户):    三.Demo ...

  10. C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别

    1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3. ...