由於公司的項目須要用到單用戶登陸,因而今天用redis和cookie給系統添加了單用戶登陸功能,再次簡單記錄一下。redis
單用戶登陸是爲了防止同一帳戶在不一樣電腦和不一樣瀏覽器裏面同時登陸。因此我這邊的思路是:數據庫
1.用戶登陸A帳號時,獲取A帳號信息和當前瀏覽器cookie裏面的token信息結合起來存到redis數據庫。瀏覽器
2.有其餘用戶登陸A帳號,更新redis裏面的用戶信息和token信息,以最後一次登陸爲準。cookie
3.寫攔截器攔截每一個請求,在處理請求時,判斷當前用戶信息與token數據和redis裏面的數據是否一致,若是不一致,則說明該帳號在別的地方登錄過,則會提示從新登陸。ide
代碼以下:spa
在用戶登陸的方法裏,寫以下代碼:將用戶登陸信息與瀏覽器token數據存入redis數據庫3d
//更新redis裏面的用戶登陸信息 string userid = userEntity.F_UserId; string companyId = userEntity.F_CompanyId; string token =Request.Cookies["__RequestVerificationToken"].Value.ToString(); cache.Remove(cache_userloginid + userid, CacheId.loginInfo); UserLoginEntity userLogin = new UserLoginEntity(); userLogin.UserLoginID = userid + "_" + companyId + "_" + token; TimeSpan cacheTime = TimeSpan.FromDays(1); cache.Write<UserLoginEntity>(cache_userloginid + userid, userLogin, cacheTime, CacheId.loginInfo);
寫攔截器,在每次請求時判斷當前用戶信息與token數據和redis裏面的數據是否一致,根據結果作出反應code
public override void OnActionExecuting(ActionExecutingContext filterContext) { // 判斷當前登陸信息是否存在 string userid = LoginUserInfo.Get() == null ? "" : LoginUserInfo.Get().userId; string companyId = LoginUserInfo.Get() == null ? "" : LoginUserInfo.Get().companyId; string token = HttpContext.Current.Request.Cookies["__RequestVerificationToken"] == null ? "" : HttpContext.Current.Request.Cookies["__RequestVerificationToken"].Value.ToString(); UserLoginEntity userLogin = cache.Read<UserLoginEntity>(cache_userloginid + userid, CacheId.loginInfo); if (userLogin != null) { //有用戶登錄中 string userLoginId = userLogin.UserLoginID; //redis中保存的用戶登陸標識 string myuserLoginId = userid + "_" + companyId + "_" + token; if (userLoginId != myuserLoginId) { //兩個用戶標識不同 filterContext.Result = new ContentResult() { Content = "<script>" + "if(confirm('你的帳號已在別處登錄,是否返回登錄頁面?')){window.location.href='/Login/Index';}else{window.close();}</script>" }; } } base.OnActionExecuting(filterContext); }
若是信息不一致,則說明在以後還有人登錄過該帳號,則會彈出提示:blog
以上就是我作這個功能的思路以及部分代碼。token