首先,弄个基类
/// <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(20)); #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(20)); 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(); } }
粗略画个图表示下