因为公司的项目需要用到单用户登录,于是今天用redis和cookie给系统添加了单用户登录功能,再次简单记录一下。

单用户登录是为了防止同一账户在不同电脑和不同浏览器里面同时登录。所以我这边的思路是:

1.用户登录A账号时,获取A账号信息和当前浏览器cookie里面的token信息结合起来存到redis数据库。

2.有其他用户登录A账号,更新redis里面的用户信息和token信息,以最后一次登录为准。

3.写拦截器拦截每个请求,在处理请求时,判断当前用户信息与token数据和redis里面的数据是否一致,如果不一致,则说明该账号在别的地方登陆过,则会提示重新登录。

代码如下:

在用户登录的方法里,写如下代码:将用户登录信息与浏览器token数据存入redis数据库

//更新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();
cache.Write<UserLoginEntity>(cache_userloginid + userid, userLogin, cacheTime, CacheId.loginInfo);

写拦截器,在每次请求时判断当前用户信息与token数据和redis里面的数据是否一致,根据结果做出反应

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);
}

如果信息不一致,则说明在之后还有人登陆过该账号,则会弹出提示:

以上就是我做这个功能的思路以及部分代码。

用redis和cookie做单用户登录的更多相关文章

  1. Asp.NET WebApi+Redis实现单用户登录实战演练

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  2. Laravel 5.3 单用户登录的简单实现

    需求 一个用户不能重复登录. 后登录者可以踢掉前者. 设计思路: 核心概念 用户ID: 是用户表主键 singleToken 算法: singleToken = md5(用户IP + 用户ID + 登 ...

  3. win2003设置单用户登录

    远程桌面是windows操作系统中一个很方便的功能,管理测试机资产.异地排除故障等,都很快捷.在windows xp sp2模式下,一般默认是单用户登录,也就是当A用户远程一台机器时,B用户在远程到这 ...

  4. Django实现单用户登录

    最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了.今天由于工作需求,需要用Django实现单用户登录.大概意思就是跟QQ一样的效果,每个账号只能一个地方登录使用,限制账号的登录次数 ...

  5. 细讲前端设置cookie, 储存用户登录信息

    细讲前端设置cookie 引言 正文 一.设置cookie 二.查看cookie 三.删除cookie 四.封装cookie操作 结束语 引言 我们都知道如果想做一个用户登录并使浏览器保存其登录信息, ...

  6. CentOS 单用户登录&命令行、图像界面

    如何单用户登录: 这是一个很简单的问题,以前没重视,每次linux服务器无法正常启动时,都找应急盘,想偷懒,反而浪费了时间. 今天备忘如下: 1.系统启动时,按光标键调出GRUB引导菜单. 2.选定一 ...

  7. aps .net MVC单用户登录

    当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线. 原文地址:http://www.cnblogs.com/f23wangj/p/4984302.htm ...

  8. ASP.NET MVC实现一个用户只能登录一次 单用户登录

    现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录.这里实现的是前一种功能. 网上有许 ...

  9. centos7 设置grub密码及单用户登录实例

    centos7与centos6在设置grub密码的操作步骤上有很大的差别,特此记录供以后查用 grub加密的目的: 防止不法分子利用单用户模式修改root密码 给grub加密可以采用明文或者加密的密文 ...

随机推荐

  1. ASP.NET MVC教程八:_ViewStart.cshtml

    一.引言 _ViewStart.cshtml是在ASP.NET MVC 3.0及更高版本以后出现的,用Razor模板引擎新建项目后,Views目录下面会出现一个这样的文件: 打开_ViewStart. ...

  2. git如何合并远程2个分支

    1,先检出项目到一个文件夹git clone 2,你检出的项目默认是master,所以现在要查看远程全部分支git branch -a * master remotes/origin/HEAD -&g ...

  3. 微信小程序——表单验证插件WxValidate的二次封装(二)

    在上一篇博客<微信小程序——仿jqueryValidate表单验证插件WxValidate的二次封装>中,我将WxValidate做了再次封装,简化了初始规则数据的构造,但是当有错误时页面 ...

  4. QJsonObject与QString转化封装

    经常使用QT的同学可能会发现有时候需要json字符串和json对象之间的转换,今天他来了,直接上代码: QString InfoBase::JsonToString(const QJsonObject ...

  5. Android 查看项目依赖树的四种方式

    Android 查看项目依赖树的四种方式: 方式一: ./gradlew 模块名:dependencies //查看单独模块的依赖 ./gradlew :app:dependencies --conf ...

  6. Linux系统学习 一、安装,调试

    环境 主机: Windows 10 虚拟机: VMware 15 Pro 镜像: 一.安装过程: 然后开启虚拟机 设置主机名 时区 密码 最小安装 等着 重启 登录 二.配置静态IP地址 输入ifco ...

  7. python的路径问题

    ## 文件路径出错问题 """ 如何获取与当前文件相关的地址 """ import os # 当前文件的完整路径 print(__file_ ...

  8. Acwing 14. 不修改数组找出重复的数字

    题目地址  https://www.acwing.com/problem/content/description/15/ 来源:剑指Offer 给定一个长度为 n+1n+1 的数组nums,数组中所有 ...

  9. BZOJ2339/LG3214 「HNOI2011」 卡农 组合数学

    问题描述 BZOJ2339 本题的一些心得 对于这种无序集合计数类问题,可以通过对方案数除以某个数的阶乘,使得无序化变为有序化. 设计DP方程时候,应该先有序的列出状态转移方程每一项的来源,并一项项推 ...

  10. js中新增的Symbol

    在ES6之前,js的的基本数据类型有String Number Null Boolean undefined Object6中数据类型,Symbol是一种新增加的基本数据类型 特性 Symbol 不需 ...