ASP.NET MVC实现一个用户只能登录一次 单用户登录
现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录。这里实现的是前一种功能。
网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html
实现原理:在服务器端记录登录的用户ID+SessionID,当重复登录时,根据用户ID用新的SessionID替换掉旧的SessionID,在需要单用户登录的操作时就可以判断SessionID是否匹配,不匹配则证明有其他人登录了你的账户,这时可要求重新登录或其他的操作。
实现步骤:1、登录时记录登录的用户ID+SessionID,可利用Application、Cache、数据库等。
2、写一个过滤器用于判断当前的用户ID和SessionID跟服务器记录的是否匹配以及不匹配时进行的操作。
3、在Session过期或者退出系统时释放资源。
步骤1:
private void GetOnline(string Name)
{
Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
if (SingleOnline == null)
SingleOnline = new Hashtable();
Session["mySession"] = "Test";
//SessionID
if (SingleOnline.ContainsKey(Name))
{
SingleOnline[Name] = Session.SessionID;
}
else
SingleOnline.Add(Name,Session.SessionID);
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Online"] = SingleOnline;
System.Web.HttpContext.Current.Application.UnLock();
}
说明:登录时将用户名(唯一标识符即可)传给该方法,该方法实现记录用户ID以及SessionID
步骤2:
public class LoginActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Hashtable singleOnline = (Hashtable)filterContext.HttpContext.Application["Online"];
// 判断当前SessionID是否存在
if (singleOnline != null && singleOnline.ContainsKey(filterContext.HttpContext.User.Identity.Name))
{
if (!singleOnline[filterContext.HttpContext.User.Identity.Name].Equals(filterContext.HttpContext.Session.SessionID))
{
filterContext.Result = new ContentResult() { Content = "<script>if(confirm('你的账号已在别处登陆,是否返回登陆页面重新登陆?')){window.location.href='/Authentication/Login';}else{window.close();}</script>" };
}
}
base.OnActionExecuting(filterContext);
}
}
说明:该过滤器用于判断是否存在重复登录的情况,过滤器怎么用这里就不多说了,若存在重复登录,则执行if语句内的处理方式,这里的处理方式是弹出个确认框,当然你也可以直接跳转到登录地址,看需要更改。
步骤3:
protected void Session_End()
{
Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
if (SingleOnline != null && SingleOnline[User.Identity.Name] != null)
{
SingleOnline.Remove(Session.SessionID);
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Online"] = SingleOnline;
System.Web.HttpContext.Current.Application.UnLock();
}
Session.Abandon();
}
说明:用于释放资源,该方法放置在Global.asax里面。
总结:基本都是参考大神们的代码,不过通过自己实践,也学会了不少东西,在这里感谢一下那些在网上分享自己心得代码的朋友,通过上述方法是可以实现单用户登录的功能的,不过性能方面还没想过会不会有问题,也没试过用cache等其他方式如何实现,后续再补充吧。
ASP.NET MVC实现一个用户只能登录一次 单用户登录的更多相关文章
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- 这算是ASP.NET MVC的一个大BUG吗?
这是昨天一个同事遇到的问题,我觉得这是一个蛮大的问题,而且不像是ASP.NET MVC的设计者有意为之,换言之,这可能是ASP.NET MVC的一个Bug(不过也有可能是保持原始请求数据而作的妥协). ...
- [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》
[ASP.NET MVC2 系列] [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序> ...
- centos单用户 救援 运行级别 yum,单用户模式,救援模式,inittab :启动级别 e2fsck wetty mingetty 物理终端 /dev/console 虚拟终端 /dev/tty(0,6) 模拟终端 /dev/pts/# grub-md5-crypt 给grub加密码 initrd 第二节课
centos单用户 救援 运行级别 yum,单用户模式,救援模式,inittab :启动级别 e2fsck wetty mingetty 物理终端 /dev/console 虚拟终端 /d ...
- ASP.NET MVC提交一个较复杂对象至WCF Service
前一篇<jQuery.Ajax()执行WCF Service的方法>http://www.cnblogs.com/insus/p/3727875.html 我们有练习在asp.net mv ...
- 新的框架,新的感觉ASP.NET MVC 分享一个简单快速适合新手的框架
在ASP.NET世界中摸爬滚打好几年,用过了各种框架,在最初的ASP.NET web from 到现在的MVC 在起初的经典三层,到现在的MVC IOC 注入 . 突然发现,有些时候真不是跟风用一 ...
- ASP.Net MVC实现一个表单多个submit
1. 用Html.BeginForm(ActionName,ControllerName,Post)来实现controller-action的路由, 2. Form里的每个input的name值统一, ...
随机推荐
- Markdown之表格的处理
目前编辑器不支持表格,以往是通过截图,呈现的效果并不好,Markdown支持html,所以我们可以用html来写表格.但是......用html写表格,实在太麻烦了,这里有个简单的转换方法,供大家参考 ...
- \\IP\e$方式访问服务器的E盘被拒绝是什么原因?
问题:服务器本地管理员的权限,首先访问是被拒绝而不是报用户名密码错误:其次远程桌面服务器是可以访问我个人点的D.E盘的 打开默认共享方法:先在控制面板的“服务”,看SERVER服务是否启动,如果没有启 ...
- 346. Moving Average from Data Stream数据窗口流中位数的数据结构设计
[抄题]: Given a stream of integers and a window size, calculate the moving average of all integers in ...
- linux系统文件的链接
一. 硬链接(实际链接) (以linux系统为例) 1. 文件的索引节点inode 假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行:This is my file. (1) ...
- 云计算 Restfull API 设计之旅
http://fedoraproject.org/wiki/Cloud_APIs_REST_Style_Guide#Introduction_to_REST http://docs.spring. ...
- javascript对变量和函数的声明提前‘hoist’
hoist vt.升起,提起; vi.被举起或抬高; n.起重机,升降机; 升起; <俚>推,托,举; 原文地址:http://www.bootcss.com/article/variab ...
- spring mabatis springmvc 看过
.Spring中AOP的应用场景.Aop原理.好处? 答:AOP--Aspect Oriented Programming面向切面编程:用来封装横切关注点,具体可以在下面的场景中使用: Authent ...
- 多视几何——三角化求解3D空间点坐标
VINS-Mono / VINS-Fusion中triangulatePoint()函数通过三角化求解空间点坐标,代码所体现的数学描述不是很直观,查找资料,发现参考文献[1]对这个问题进行详细解释,记 ...
- 最大公约数(gcd)和 最小公倍数(lcm)——辗转相除法
辗转相除法(又称欧几里得算法)是求最大公因数的算法 要求a,b的最大公约数(a>b),我们可以递归地求b,a%b的最大公约数,直到其中一个数变成0,这时另一个数就是a,b的最大公约数. C++实 ...
- 让你大开眼界的10款Android界面设计
根据调查显示, iOS与Android的市场份额差距正越来越大.Android设备正在成为手机应用市场的主力军.如何从设计层面创造一个优美的app界面来吸引用户已然成为广大App开发者们必做的功课之一 ...