[转载]MVC中单用户登录
转自:http://www.cnblogs.com/firstcsharp/archive/2013/05/19/3087481.html
把下面这段代码放在登录用户验证以后:
//用户登录验证通过后判断用户是否重复登录
public void SingleUserCheck(string userid)
{
HttpContext httpContext = System.Web.HttpContext.Current;
Hashtable userOnline = (Hashtable)httpContext.Application["Online"];
if (userOnline != null)
{
int i = 0;
while (i < userOnline.Count)
{
IDictionaryEnumerator idE = userOnline.GetEnumerator();
string strKey = string.Empty;
while (idE.MoveNext())
{
if (idE.Value != null && idE.Value.ToString().Equals(userid)) //如果当前用户已经登录,
{
strKey = idE.Key.ToString();
userOnline[strKey] = "XXXXXX"; //将当前用 户已经在全局变量中的值设置为XX
break;
}
}
i++;
}
}
else
{
userOnline = new Hashtable();
}
userOnline[httpContext.Session.SessionID] = userid; //初始化当前用户的 sessionid
httpContext.Application.Lock();
httpContext.Application["Online"] = userOnline;
httpContext.Application.UnLock();
}
添加验证特性类,自动让已经登录的用户下线:
using System.Collections; namespace System.Web.Mvc
{
public class SingleUserAuthorize:AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
Hashtable userOnline = (Hashtable)(httpContext.Application["Online"]);
if(userOnline!=null)
{
IDictionaryEnumerator idE=userOnline.GetEnumerator();
string strkey=string.Empty;
if(userOnline.Count>0)
{
while(idE.MoveNext())
{
//登录时判断保存的session是否与当前页面的session相同
if (userOnline.Contains(httpContext.Session.SessionID))
{
if (idE.Key != null && idE.Key.ToString().Equals(httpContext.Session.SessionID))
{
//判断当前session保存的值是否为被注销值
if (idE.Value != null && "XXXXXX".Equals(idE.Value.ToString()))
{
//验证被注销则清空session
userOnline.Remove(httpContext.Session.SessionID);
httpContext.Application.Lock();
httpContext.Application["Online"] = userOnline;
httpContext.Response.Write("<script>alert('你的帐号在别处登录,你被强迫下线!');location.href='/Load';</script>");
httpContext.Response.End();
return false;
}
}
}
else
{
return false;
}
}
return true;
}
else
{
return false;
}
}
return false;
}
}
}
验证的时候在控制器里添加:
[SingleUserAuthorize]
最后在Global.asax.cs里添加如下代码:
//单点登录代码开始
protected void Session_Start(object sender, EventArgs e) { }
protected void Session_End(object sender, EventArgs e)
{
Hashtable hOnline = (Hashtable)Application["Online"];
if (hOnline[Session.SessionID] != null)
{
hOnline.Remove(Session.SessionID);
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
}
}
//单点登录代码结束
[转载]MVC中单用户登录的更多相关文章
- MVC下用户登录状态校验的问题以及解决方案--------------Action全局过滤器的使用
前言当我们访问某个网站的时候需要检测用户是否已经登录(通过Session是否为null),我们知道在WebForm中可以定义一个BasePage类让他继承System.Web.UI.Page,重写它的 ...
- 基于Servlet的MVC模式用户登录实例
关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: ...
- aps .net MVC单用户登录
当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线. 原文地址:http://www.cnblogs.com/f23wangj/p/4984302.htm ...
- Asp.Net MVC记住用户登录信息 下次登录无需输入密码
有的时候做网站,就需要记住用户登录信息,下次再登录网站时,不用重复输入用户名和密码,原理是浏览器的cookie把状态给记住了! 那么具体是怎么实现的呢?下面博主将一部分代码贴出来,想要完整版的Demo ...
- mybatis 和servlet使用MVC实现用户登录,注册,退出
普通实现: USerMapper.java: package com.bjsxt.mapper; import org.apache.ibatis.annotations.Param; import ...
- Asp.net mvc验证用户登录之Forms实现
这里我们采用asp.net mvc 自带的AuthorizeAttribute过滤器验证用户的身份,也可以使用自定义过滤器,步骤都是一样. 第一步:创建asp.net mvc项目, 在项目的App_S ...
- MVC学习笔记:MVC实现用户登录验证ActionFilterAttribute用法并实现统一授权
在项目下新建一个文件夹来专门放过滤器类,首先创建一个类LoginFilter,这个类继承ActionFilterAttribute.用来检查用户是否登录和用户权限.: using System; us ...
- MVC简单用户登录授权认证
1.控制器上面用 [Authorize] 属性标识,表示当前控制器内的所有函数需要用户认证才能访问 2.函数上面用 [AllowAnonymous] 属性标识,表示当前函数不需要用户认证可以直接访问 ...
- asp.net -mvc框架复习(7)-基于MVC搭建用户登录项目框架
整体框架: 一.搭建Model层 1.添加通用数据访问类 2.添加实体类(封装和传递数据,和数据库中数据表对应) 3.添加数据访问类(通常和实体类同名,但是后缀名发生改变) 二.搭建控制器层Contr ...
随机推荐
- 手机浏览器,微信浏览器对background-color不显示的问题
PC上的浏览器可以正常显示,但是到了手机上就不显示了,古怪的问题花了我一晚上都没解决. 今天突然想到会不会是某些特立独行的了浏览器为了彰显个性,采用不同别人的解析方式呢? 我的原来CSS是这么写的: ...
- [React] Use the URL as the source of truth in React
In Single Page Apps we're used to fetch the data on event callbacks. That disables the capacity to u ...
- C++的class的样例
私有就是仅仅可以通过内部调用,在类外面是不可以使用私有成员的 简单的写一个 Class A { public: //你能够通过公有的函数去訪问私有成员 Demo() //能够在这使 ...
- SICP 习题 (1.39)解题总结
SICP 习题1.39沿着习题1.37, 1.38的方向继续前行,要求我们依据德国数学家J.H.Lambert的公式定义tan-cf过程,用于计算正切函数的近似值. J.H.Lambert的公式例如以 ...
- RingtoneManager-获得系统当前的铃声
我们直接看代码 bt1 = (Button) findViewById(R.id.bt1); bt2 = (Button) findViewById(R.id.bt2); bt3 = (Button) ...
- php中this,self,parent三个关键字的区别辨析
php中this,self,parent三个关键字的区别辨析 一.总结 一句话总结:this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用. 1.self关键字使用 ...
- JS 实现图片模态框,幻灯片,跑马灯功能
网站中常用的幻灯片和模态框,使用 HTML.JavaScript 与 CSS 来创建 Lightbox,类似相册预览功能.可以运用到视频网站,商城,相册上去 参考了菜鸟教程,有兴趣自己去看 HTML/ ...
- PMP杂谈--名词解释
过程:PMP中常常提到过程,好像非常高大上,实则不然,过程说白了就是一系列的行动和活动,用来创建预定的产品,服务或成果. 就这么简单. 再深入点就是,行动和活动当然都会有ITTO(输入,工具和技术.输 ...
- 12.模板别名以及auto定义返回值
#include <iostream> #include <array> using namespace std; //定义返回值类型 template<class T1 ...
- C# socket beginAccept
服务端: 需要增加的命名空间:using System.Threading;using System.Net;using System.Net.Sockets; 以下是具体实现.C# co ...