MVC登陆认证简单设置
首先,弄个基类
/// <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登陆认证简单设置的更多相关文章
- 【配置】检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为【经典】模式)。
× 检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为[经典]模式). 我们将ASP.NET程序从IIS6移植到IIS7,可能运行提示以下错误: HTTP 错误 5 ...
- Spring Boot确保Web应用安全(登陆认证)
Spring Boot官方提供了一个登陆认证的清晰易懂的 例子 , 我们在次以此例展开演示Spring Boot是如何实现登陆认证的. 首先我们去 https://start.spring.io/ 下 ...
- 批量实现SSH无密码登陆认证脚本
批量实现SSH无密码登陆认证脚本 问题背景 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 1.通过 ssh-key-ge ...
- 批量SSH key-gen无密码登陆认证脚本 附件脚本
# 批量实现SSH无密码登陆认证脚本 ## 问题背景 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 1.通过 ssh-k ...
- ASP.NET MVC 3 入门级常用设置、技巧和报错
1.ASP.NET MVC 3 如何去除默认验证 这个默认验证是在web.config配置文件中设置的 <add key="ClientValidationEnabled&quo ...
- spring-security 登陆认证之初次探究
首先,希望还对 spring-security框架完全不懂的新手 下载下Git源码. 引入到项目中.这个短文就是边看源码边聊的.也会启动下项目验证自己的推想. 一.登陆认证的登陆配置项 <for ...
- 使用TT模板+mvc+wcf实现简单查询
今天是除夕,小编的这篇博客是掐着点儿发的,在此,祝各位小伙伴新年快乐,身体健康,万事如意:喜从天降,欣喜若狂:喜气盈门,好事成双:好人好运,金玉满堂:神采飞扬,如愿以偿,财源滚滚来,福如东海长:伴随着 ...
- Spring集成shiro做登陆认证
一.背景 其实很早的时候,就在项目中有使用到shiro做登陆认证,直到今天才又想起来这茬,自己抽空搭了一个spring+springmvc+mybatis和shiro进行集成的种子项目,当然里面还有很 ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
随机推荐
- Cordova - 解决升级NDK之后无法编译!
先前Cordova工作正常,今天升级了一下Android Studio,随后发现NDK也有升级包了,于是顺利升级了NDK!升级完毕发现,无法正常编译了,错误提示如下: No toolchains fo ...
- Bit Manipulation-476. Number Complement
Given a positive integer, output its complement number. The complement strategy is to flip the bits ...
- Bootstrap框架(一)
day57 参考:https://www.cnblogs.com/liwenzhou/p/8214637.html 下载:http://www.bootcss.com/ 选择用于生产环境的 Boo ...
- 在Load average 高的情况下如何鉴别系统瓶颈
在Load average 高的情况下如何鉴别系统瓶颈.是CPU不足,还是io不够快造成? 或是内存不足? 一:查看系统负载vmstat procs -----------memory-------- ...
- elasticsearch geo_point 地理位置过滤 按经度排序
elasticsearch 支持强大的经纬度坐标过滤. 1.首先要建立坐标类型的字段'type' ='geo_point' es存储的值是这样的: "poi": [ ...
- 理解js事件冒泡事件委托事件捕获
js事件冒泡 javascript的事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止,这就是事件冒泡现象. <di ...
- webpack快速入门——配置文件:入口和出口,多入口、多出口配置
1.在根目录新建一个webpack.config.js文件,然后开始配置: const path = require('path'); module.exports={ //入口文件的配置项 entr ...
- 【bug】使用微信分享SDK,配置成功但分享信息异常
使用微信JSD做H5分享功能时,显示配置成功,但分享出去的信息并不是配置中的信息.(p.s. ios 分享后只有一个当前的链接,androd连分享的图标都没有), 最终找的的原因是:分享的链接中,参数 ...
- [underscore源码学习]——`>>` 运算符和二分查找
这是一篇记录学习 underscore v0.0.5 的fragment,觉得有点意思,和大家分享一下. 先看_.sortedIndex的源码,它用来确定 obj 在 array中的位置(array升 ...
- Android之系统架构
Android 是Google开发的基于Linux平台的开源手机操作系统.它包括操作系统.用户界面和应用程序 —— 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍.Andr ...