首先,弄个基类

 /// <summary>
/// 所有控制器基类,里面重写了OnActionExecuted方法
/// </summary>
public class BaseController : Controller
{ /// <summary>
/// 是否需要校验
/// </summary>
public bool IsCheckLogin { get; set; } = true; /// <summary>
/// 已登陆的用户信息
/// </summary>
public UserInfo LoginUser { get; set; } /// <summary>
/// 在方法执行之前调用
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext); //如果页面需要校验 if (IsCheckLogin)
{
#region Session方式
////校验用户是否登陆
//if (filterContext.HttpContext.Session["LoginUser"] == null)
//{
// //为空,则跳转到登陆
// filterContext.HttpContext.Response.Redirect("/UserLogin/Index"); //}
//else
//{
// //不为空,则将用户登陆信息存储
// LoginUser = filterContext.HttpContext.Session["LoginUser"] as UserInfo;
// //将信息存入viewBag中
// ViewBag.UserInfo = LoginUser;
//}
#endregion #region 缓存方式
//校验用户是否登陆
//获取cookie中的信息 if (Request.Cookies["userLoginGuid"] == null)
{
//为空,则跳转到登陆
filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
return;
}
string guidUser = Request.Cookies["userLoginGuid"].Value;
UserInfo userInfo = CacheHelper.getCache<UserInfo>(guidUser);
if (userInfo == null)
{
//用户长时间不操作,超时
filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
return;
} //不为空,则将用户登陆信息存储
LoginUser = userInfo;
//将信息存入viewBag中
if (LoginUser == null)
{
ViewBag.UserInfo = "";
}
else
{
ViewBag.UserInfo = LoginUser;
} //滑动窗口机制
CacheHelper.SetCache(guidUser, userInfo, DateTime.Now.AddMinutes());
#endregion }
} }

,这个基类中有两个属性,

一个是IsCheckLogin,默认为true,该属性主要在子类的构造函数中进行初始化,确定子类是否需要进行登陆认证,一般登陆控制器应设为false

一个是LoginUser,主要记录当前登陆成功用户的实体类

在重写OnActionExecuting的方法中,首先校验IsCheckLogin是否为true,如是,则说明需要登陆校验

此时从cookie中找到登陆时随机生成的guid码,如果没有找到,则直接返回到登陆界面

如果找到,则依据此guid码从缓存中寻找对应的用户实体,如果没有找到一样返回登陆界面,

如果找到则将用户实体放入LoginUser中,以便子类需要.

最后设置缓存的过期时间

其中还用到缓存,缓存类的代码如下

 public interface ICacheWrite
{
bool AddCache(string key, object value);
bool AddCache(string key, object value, DateTime exprity);
object GetCache(string key);
T getCache<T>(string key); void SetCache(string key, object value, DateTime exprity);
void SetCache(string key, object value);
}

缓存的接口类

public class HttpRuntimeCacheWriter : ICacheWrite
{
public bool AddCache(string key, object value)
{
HttpRuntime.Cache.Insert(key, value);
return true;
} public bool AddCache(string key, object value, DateTime exprity)
{
HttpRuntime.Cache.Insert(key, value, null, exprity, TimeSpan.Zero);
return true;
} public object GetCache(string key)
{
return HttpRuntime.Cache.Get(key);
} public T getCache<T>(string key)
{
return (T)HttpRuntime.Cache[key];
} public void SetCache(string key, object value)
{
HttpRuntime.Cache.Remove(key);
AddCache(key, value);
} public void SetCache(string key, object value, DateTime exprity)
{
throw new NotImplementedException();
} }

运用HttpRuntime缓存

public class CacheHelper
{
//这里应该用注入,因为可能更改为其它实现了ICacheWrite的对象
public static ICacheWrite write { get; set; } = new HttpRuntimeCacheWriter(); //new MemcacheWriter(); public static bool AddCache(string key, object value)
{
return write.AddCache(key, value);
} public static bool AddCache(string key, object value, DateTime exprity)
{
return write.AddCache(key, value, exprity);
} public static object GetCache(string key)
{
return write.GetCache(key);
} public static T getCache<T>(string key)
{
return write.getCache<T>(key);
} public static void SetCache(string key, object value)
{
write.SetCache(key, value);
} public static void SetCache(string key, object value, DateTime exprity)
{
write.SetCache(key, value, exprity);
}
}

缓存帮助类

然后前台调用示例

public class LoginController : BaseController
{
//得到用户服务层对象
IUserInfoSerivce userSerivce = new UserInfoSerivce(); public LoginController()
{
this.IsCheckLogin = false;
}
// GET: Login
public ActionResult Login()
{ return View();
} /// <summary>
/// 进行简单登陆检验
/// </summary>
/// <param name="uid"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public ActionResult Check(string uid,string pwd)
{
if (!Checked(uid,pwd))
{
var user = userSerivce.GetEntities(u => u.Uid == uid && u.pwd == pwd).FirstOrDefault();
if (user!=null)
{
//立即分配一个标志,Guid,把标志作为key(并写入cookie中),把用户放到value中
string userLoginGuid = Guid.NewGuid().ToString();
Response.Cookies["userLoginGuid"].Value = userLoginGuid;
//将用户登陆信息存到缓存中
CacheHelper.AddCache(userLoginGuid, user, DateTime.Now.AddMinutes());
return Content("ok");
}
}
return Content("ok");
} /// <summary>
/// 检查用户名密码是否正确
/// </summary>
/// <param name="uid"></param>
/// <param name="pwd"></param>
/// <returns></returns>
private bool Checked(string uid,string pwd)
{
bool reslut = string.IsNullOrEmpty(uid) || string.IsNullOrEmpty(pwd);
return reslut;
}
}

其它控制器只用继承基类即可

 public class DefaultController : BaseController
{
IBLL.IFriendInfoSerivce friendSerivce = new BLL.FriendInfoSerivce();
// GET: Default
public ActionResult Index()
{
ViewData.Model = friendSerivce.GetEntities(f => !f.DelFlag);
return View();
}
}

粗略画个图表示下

MVC登陆认证简单设置的更多相关文章

  1. 【配置】检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为【经典】模式)。

      ×   检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为[经典]模式). 我们将ASP.NET程序从IIS6移植到IIS7,可能运行提示以下错误: HTTP 错误 5 ...

  2. Spring Boot确保Web应用安全(登陆认证)

    Spring Boot官方提供了一个登陆认证的清晰易懂的 例子 , 我们在次以此例展开演示Spring Boot是如何实现登陆认证的. 首先我们去 https://start.spring.io/ 下 ...

  3. 批量实现SSH无密码登陆认证脚本

    批量实现SSH无密码登陆认证脚本 问题背景 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 1.通过 ssh-key-ge ...

  4. 批量SSH key-gen无密码登陆认证脚本 附件脚本

    # 批量实现SSH无密码登陆认证脚本 ## 问题背景 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 1.通过 ssh-k ...

  5. ASP.NET MVC 3 入门级常用设置、技巧和报错

    1.ASP.NET MVC 3 如何去除默认验证 这个默认验证是在web.config配置文件中设置的    <add key="ClientValidationEnabled&quo ...

  6. spring-security 登陆认证之初次探究

    首先,希望还对 spring-security框架完全不懂的新手 下载下Git源码. 引入到项目中.这个短文就是边看源码边聊的.也会启动下项目验证自己的推想. 一.登陆认证的登陆配置项 <for ...

  7. 使用TT模板+mvc+wcf实现简单查询

    今天是除夕,小编的这篇博客是掐着点儿发的,在此,祝各位小伙伴新年快乐,身体健康,万事如意:喜从天降,欣喜若狂:喜气盈门,好事成双:好人好运,金玉满堂:神采飞扬,如愿以偿,财源滚滚来,福如东海长:伴随着 ...

  8. Spring集成shiro做登陆认证

    一.背景 其实很早的时候,就在项目中有使用到shiro做登陆认证,直到今天才又想起来这茬,自己抽空搭了一个spring+springmvc+mybatis和shiro进行集成的种子项目,当然里面还有很 ...

  9. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

随机推荐

  1. vs 生成事件 +版本号+sed.exe

    set ASMINFO=Properties\AssemblyInfo.csFINDSTR /C:"[assembly: AssemblyVersion(" %ASMINFO% | ...

  2. Sql语法高级应用之七:如何在存储过程中使用事务

    普通事物: USE Wot_Inventory; GO BEGIN TRANSACTION tr; DECLARE @error INT; SET @error = 0; SELECT * FROM ...

  3. vhosetuser 和 vhostuservlient 差异

    Open vSwitch支持的vHost-user类型 在Open vSwitch中vHost User通过socket进行通信,模式为client-server,其中server端负责创建/管理/销 ...

  4. 使用过Memcache缓存吗?如果使用过,能够简单描述下其工作原理吗?

    Memcache是把所有数据保存在内存中,采用hash表的方式,每条数据由key和value组成,每个key独一无二的.Memcache采用LRU算法逐渐把过期数据清除掉.

  5. Python小白学习之路(二)—【Pycharm安装与配置】【创建项目】【运算符】【数据类型】

    写在前面: 第二天的学习,感觉比昨天学习相对轻松一些,但是对于我这个编程语言功底很弱的人来说,还是稍稍微有些.....哈尔滨的天气一天天冷了下来,还飘着小雨,不过还是挺有意境的.充实而又忙碌的生活,让 ...

  6. 解决ORA-21561: OID generation failed

    解决ORA-21561 在linux上使用sqlplus连接oracle数据库 [root@china ~]# sqlplus test/test@ORCL SQL Production :: Cop ...

  7. 【jxoi2018】游戏 组合数学

    首先令$n=r-l+1$. 令$k$表示区间$[l,r]$中存在多少个数$x$,使得$x$不存在小于$x$且在区间$[l,r]$中的因数,我们把包含这些数的数集称为$S$ 我们来先想一个$O(nk)$ ...

  8. POJ 2316

    #include<iostream> #include<stdio.h> #include<string> using namespace std; ]; int ...

  9. [原创] rtrim() 格式化中文问题

    先看以下代码 var_dump(rtrim("互联网产品.", ".")); 我们以为会得到结果 "互联网产品", 但实际上获得的是 &qu ...

  10. 剑指offer四十之数组中只出现一次的数字

    一.题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 二.思路 建一个hashMap,统计各数字出现的次数,然后遍历hashMap,输出出现一次的数字 ...