如何实现一个用户登录后,禁止其他用户用同一ID登录,请高手帮忙! 如何实现一个用户登录后,禁止其他用户用同一ID登录,请高手帮帮忙!需要用到什么样的对象和技术路线!急ing!老板催ing! 谢谢ed先! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://community.csdn.net/Expert/topic/3867/3867653.xml?temp=.6136743呵呵,其实这个问题就这样的,你看,这个你看了后你就自己去构思一下思路吧,都在里面了,HOHO http://dotnet.aspx.cc/ShowDetail.aspx?id=CF5FFABC-CFE1-4368-3C13-9B4FCD7C7168 http://blog.csdn.net/21aspnet/archive/2005/03/15/319885.aspx 在不同的电脑上实现单点...alexzhang00()就不行了。 SingleLogin.aspx代码<%@ Page language="c#" Codebehind="SingleLogin.aspx.cs" AutoEventWireup="false" Inherits="eMeng.Exam.SingleLogin" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML><HEAD><title>单点登录测试</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta http-equiv="Author" content="孟子E章"><meta http-equiv="WebSite" content="http://dotnet.aspx.cc/"><style>H3 { FONT: 17px 宋体 }INPUT { FONT: 12px 宋体 }SPAN { FONT: 12px 宋体 }P { FONT: 12px 宋体 }H4 { FONT: 12px 宋体 }</style></HEAD><body MS_POSITIONING="GridLayout"><form id="Form1" method="post" runat="server"> <div align="center"> <h3>单点登录测试</h3> <p>用户名称:<asp:TextBox id="UserName" runat="server"></asp:TextBox></p> <p>用户密码:<asp:TextBox id="PassWord" runat="server" TextMode="Password"></asp:TextBox></p> <p><asp:Button id="Login" runat="server" Text=" 登 录 "></asp:Button></p> <p><asp:Label id="Msg" runat="server"></asp:Label></p> </div></form></body></HTML>SingleLogin.aspx.cs代码using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;namespace eMeng.Exam{/// <summary>/// SingleLogin 的摘要说明。/// 实现单点登录/// </summary>public class SingleLogin : System.Web.UI.Page{protected System.Web.UI.WebControls.TextBox UserName;protected System.Web.UI.WebControls.TextBox PassWord;protected System.Web.UI.WebControls.Label Msg;protected System.Web.UI.WebControls.Button Login;private void Page_Load(object sender, System.EventArgs e){ // 实际例子可访问: // http://dotnet.aspx.cc/Exam/SingleLogin.aspx}#region Web 窗体设计器生成的代码override protected void OnInit(EventArgs e){ InitializeComponent(); base.OnInit(e);}/// <summary>/// 设计器支持所需的方法 - 不要使用代码编辑器修改/// 此方法的内容。/// </summary>private void InitializeComponent(){ this.Login.Click += new System.EventHandler(this.Login_Click); this.Load += new System.EventHandler(this.Page_Load);}#endregionprivate void Login_Click(object sender, System.EventArgs e){ // 作为唯一标识的Key,应该是唯一的,这可根据需要自己设定规则。 // 做为测试,这里用用户名和密码的组合来做标识;也不进行其它的错误检查。 // 生成Key string sKey = UserName.Text + "_" + PassWord.Text; // 得到Cache中的给定Key的值 string sUser = Convert.ToString(Cache[sKey]); // 检查是否存在 if (sUser == null || sUser == String.Empty) { // Cache中没有该Key的项目,表名用户没有登录,或者已经登录超时 // 注意下面使用的TimeSpan构造函数重载版本的方法,是进行是否登录判断的关键。 TimeSpan SessTimeOut = new TimeSpan(0,0,System.Web.HttpContext.Current.Session.Timeout,0,0); HttpContext.Current.Cache.Insert(sKey,sKey,null,DateTime.MaxValue,SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable,null); Session["User"] = sKey; // 首次登录,您可以做您想做的工作了。 Msg.Text="<h4 style='color:red'>嗨!欢迎您访问<a href='http://dotnet.aspx.cc/'>【孟宪会之精彩世界】"; Msg.Text += "</a>,祝您浏览愉快!:)</h4>"; } else { // 在 Cache 中发现该用户的记录,表名已经登录过,禁止再次登录 Msg.Text="<h4 style='color:red'>抱歉,您好像已经登录了呀:-(</h4>"; return; }}}} 数据库中增加一个字段,eg: in_state 0代表第一个登陆,1代表此帐号已经登陆。登陆后判断in-state,如果为0则登陆,如果为1则不能登陆。退出时再还原 试试用Application对象保存已登陆用户ID jhqjhq(逗号)的方法有问题,万一这人登陆了,意外情况离开了,数据库的记录仍然是在线的记录,那他这个id岂不是永远也上不去了! flyinbob12349878(似水年华)的方法也有问题,一登陆就设定cache的过期时间是20分钟(假设session的过期时间是默认的)但如果该用户20分钟后还在线呢?而cache已经被清了这时候不是又可以登陆了吗?如果在点击离开按钮后删除缓存,应该怎么做????在同一台电脑上是可以了,但我在这登陆了,另一个人也用相同的id在不同的地方登陆怎么控制? 孟大哥的那个页算是个方法,但是不是很完善!另外你可以建立一张数据表如楼上所说:数据库中增加一个字段,eg: in_state 0代表第一个登陆,1代表此帐号已经登陆。登陆后判断in-state,如果为0则登陆,如果为1则不能登陆。退出时再还原这个页可以 这个我倒是有一个思路:系统可以建一个SysUser ----存储系统用户的一些信息再建一个 UserOnline ------存储登陆用户的帐号、登陆时间、ip等等一个用户登录先验证系统帐号的准确性,再看是否在UserOnline中存在记录如果存在说明已经用同样帐号登陆,不允许登陆(这个应该小菜一碟)如果不存在则允许登陆,同时在UserOnline 中插入记录。欢迎大家共同探讨~~ Application的好处是不用经过数据库,数据库加字段的好处是服务重启后登录情况还在。一般用不着,除非是一些真的非常长效的登录(这种情况也可结合cookie和Application解决)。Session是不行的,Cathe时效太短。我的做法是建一个登录ID的list,在服务启动时就加载到Application(此时当然是空的)。当有ID要登录时就先查Application的这个list中有没有,没有就给登,之后在Application中加上。单击离开按钮时触发一个函数从Application中删除该ID,Session过期时也可调用这个函数删除登录。防止在网吧使用忘记登出导致再也登不进的情况……如果用数据库里长久存储登录状态的方法,更应注意Session过期后一定也要删掉登录信息,另外还要记得服务加载时把数据库里所有的登录状态都设成不登录,以防止意外关机的情况 Session_OnStart(){//检查数据库中是否有本帐号的登陆信息//在数据库中注册本帐号的登陆信息}Session_OnEnd(){//删除数据库中的本帐号登陆信息} 楼上的关键是在那个session文件里面写代码来查看数据库 我们公司做了一个OA,我的做法是在数据库的用户表中添加两个字段,记录用户是否登录以及最后一次的登陆IP,在用户登录的时候做判断,如果用户是登陆状态,就判断登陆IP是否相同,如果相同则允许登陆,如果不同提示此帐户已在使用中。为了防止在同一台机器上登陆,系统在登陆后打开一个命名的窗口,如果用户再次登陆,也只显示这一个窗口。为了防止用户非正常退出,在session_end里写入了修改数据库中用户在线状态的程序,session过期时间为20分钟。 这个问题我们公司的一个客户要求过我是这样实现的1.在数据库增加一个表记录在线情况statidusernamelastactivecookiekey2.用cookiekey标识用户身份可以把cookiekey保持时间设的长些,以保持一定时间内都有标识(保持100年也行)为什么不用IP呢,我们考虑的是内网与外网就没用---------登录:检查statid,如果存在且cookie不同,且用lastactive用现在时间作比较,如果是允许自动掉线时间内的说明不能登录-------------登录以后写入cookie每次访问刷新lastactive-------------如果超时了,其它用户还是可以登录你可以设置这个时间长短最好做一个KILLID的页因为单一登录的目的是防止多用户操作出现不协调才存在的 我的方法是不用cookies,直接用数据库,建一个表(userid,lastdate)设置一个时间间隔(建一个frame里面有个每隔X分钟向数据库更新当前时间)用户登录时判断是否有当前用户记录,1:有,则判断getdate()是否大于lastdate为X分钟,2.没有则为没在线.这样则可以表明当前用户是否在线.用这个思路.看看如何中. 数据库中增加一个字段,eg: in_state 0代表第一个登陆,1代表此帐号已经登陆。登陆后判断in-state,如果为0则登陆,如果为1则不能登陆。退出时再还原-----------------------------不支持这种方法,如果非法掉线了怎么办,那不是永远为0?我想如果将登录标志就放在内存呢? 完全支持 murasaki(风羽) 的方法 murasaki(风羽) 的方法可行,注意在Application中修改检查登录信息时要Application.lock防止冲突 我的想法和 风习习 一样 点击确定时 先在 appl["user_list"] 时查找。。看有没有 user_box.text中的内容 如果有。报错 没有...联接数据库验证.成功 appl["uers_list"] = appl["uers_list"] + user_box.text 不成功 返回在会话断开时在事件里 把 appl["uers_list"]中当前的 user 删除掉. 如何得到TreeView中复选框的值传入SQL,谢谢! TFS 2010 没有真正签入文件 数据库中有多个连续空格的值,为什么查询出来时都变成一个空格了? 学习.net web 方面要学习那里语言? 谁能帮我把以下的ASP代码改成ASP.NET下可用的? 如何把参数传到数据库的存储过程中生成sql语句的执行? 如何修改DataSet中表的字段类型。 如何在两个网页之间传递中文字符串? 水晶报表的参数问题? listbox 使用FTP上传文件时候的中文问题。 ie浏览器中用Ftp上传得解决方案!activex
<%@ Page language="c#" Codebehind="SingleLogin.aspx.cs" AutoEventWireup="false"
Inherits="eMeng.Exam.SingleLogin" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>单点登录测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="Author" content="孟子E章">
<meta http-equiv="WebSite" content="http://dotnet.aspx.cc/">
<style>
H3 { FONT: 17px 宋体 }
INPUT { FONT: 12px 宋体 }
SPAN { FONT: 12px 宋体 }
P { FONT: 12px 宋体 }
H4 { FONT: 12px 宋体 }
</style>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<div align="center">
<h3>单点登录测试</h3>
<p>用户名称:<asp:TextBox id="UserName" runat="server"></asp:TextBox></p>
<p>用户密码:<asp:TextBox id="PassWord" runat="server" TextMode="Password"></asp:TextBox></p>
<p><asp:Button id="Login" runat="server" Text=" 登 录 "></asp:Button></p>
<p><asp:Label id="Msg" runat="server"></asp:Label></p>
</div>
</form>
</body>
</HTML>SingleLogin.aspx.cs代码using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;namespace eMeng.Exam
{
/// <summary>
/// SingleLogin 的摘要说明。
/// 实现单点登录
/// </summary>
public class SingleLogin : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox UserName;
protected System.Web.UI.WebControls.TextBox PassWord;
protected System.Web.UI.WebControls.Label Msg;
protected System.Web.UI.WebControls.Button Login;private void Page_Load(object sender, System.EventArgs e)
{
// 实际例子可访问:
// http://dotnet.aspx.cc/Exam/SingleLogin.aspx
}#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Login.Click += new System.EventHandler(this.Login_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregionprivate void Login_Click(object sender, System.EventArgs e)
{
// 作为唯一标识的Key,应该是唯一的,这可根据需要自己设定规则。
// 做为测试,这里用用户名和密码的组合来做标识;也不进行其它的错误检查。 // 生成Key
string sKey = UserName.Text + "_" + PassWord.Text;
// 得到Cache中的给定Key的值
string sUser = Convert.ToString(Cache[sKey]);
// 检查是否存在
if (sUser == null || sUser == String.Empty)
{
// Cache中没有该Key的项目,表名用户没有登录,或者已经登录超时
// 注意下面使用的TimeSpan构造函数重载版本的方法,是进行是否登录判断的关键。
TimeSpan SessTimeOut = new TimeSpan(0,0,System.Web.HttpContext.Current.Session.Timeout,0,0);
HttpContext.Current.Cache.Insert(sKey,sKey,null,DateTime.MaxValue,SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,null);
Session["User"] = sKey;
// 首次登录,您可以做您想做的工作了。
Msg.Text="<h4 style='color:red'>嗨!欢迎您访问<a href='http://dotnet.aspx.cc/'>【孟宪会之精彩世界】";
Msg.Text += "</a>,祝您浏览愉快!:)</h4>";
}
else
{
// 在 Cache 中发现该用户的记录,表名已经登录过,禁止再次登录
Msg.Text="<h4 style='color:red'>抱歉,您好像已经登录了呀:-(</h4>";
return;
}
}
}
}
登陆后判断in-state,如果为0则登陆,如果为1则不能登陆。
退出时再还原
但如果该用户20分钟后还在线呢?
而cache已经被清了
这时候不是又可以登陆了吗?如果在点击离开按钮后删除缓存,应该怎么做????
在同一台电脑上是可以了,但我在这登陆了,另一个人也用相同的id在不同的地方登陆怎么控制?
另外你可以建立一张数据表
如楼上所说:数据库中增加一个字段,eg: in_state 0代表第一个登陆,1代表此帐号已经登陆。
登陆后判断in-state,如果为0则登陆,如果为1则不能登陆。
退出时再还原这个页可以
系统可以建一个SysUser ----存储系统用户的一些信息
再建一个 UserOnline ------存储登陆用户的帐号、登陆时间、ip等等一个用户登录先验证系统帐号的准确性,再看是否在UserOnline中存在记录
如果存在说明已经用同样帐号登陆,不允许登陆(这个应该小菜一碟)
如果不存在则允许登陆,同时在UserOnline 中插入记录。欢迎大家共同探讨~~
Session是不行的,Cathe时效太短。
我的做法是建一个登录ID的list,在服务启动时就加载到Application(此时当然是空的)。当有ID要登录时就先查Application的这个list中有没有,没有就给登,之后在Application中加上。
单击离开按钮时触发一个函数从Application中删除该ID,Session过期时也可调用这个函数删除登录。防止在网吧使用忘记登出导致再也登不进的情况……如果用数据库里长久存储登录状态的方法,更应注意Session过期后一定也要删掉登录信息,另外还要记得服务加载时把数据库里所有的登录状态都设成不登录,以防止意外关机的情况
{
//检查数据库中是否有本帐号的登陆信息
//在数据库中注册本帐号的登陆信息
}
Session_OnEnd()
{
//删除数据库中的本帐号登陆信息
}
我是这样实现的
1.在数据库增加一个表记录在线情况statid
username
lastactive
cookiekey
2.用cookiekey标识用户身份
可以把cookiekey保持时间设的长些,以保持一定时间内都有标识(保持100年也行)
为什么不用IP呢,我们考虑的是内网与外网就没用
---------
登录:
检查statid,如果存在且cookie不同,且用lastactive用现在时间作比较,如果是允许自动掉线时间内的说明不能登录
-------------
登录以后写入cookie
每次访问刷新lastactive
-------------如果超时了,其它用户还是可以登录
你可以设置这个时间长短最好做一个KILLID的页
因为单一登录的目的是防止多用户操作出现不协调才存在的
用户登录时判断是否有当前用户记录,1:有,则判断getdate()是否大于lastdate为X分钟,2.没有则为没在线.这样则可以表明当前用户是否在线.用这个思路.看看如何中.
登陆后判断in-state,如果为0则登陆,如果为1则不能登陆。
退出时再还原
-----------------------------不支持这种方法,
如果非法掉线了怎么办,那不是永远为0?我想如果将登录标志就放在内存呢?
先在 appl["user_list"] 时查找。。看有没有 user_box.text中的内容
如果有。报错
没有...联接数据库验证.成功
appl["uers_list"] = appl["uers_list"] + user_box.text
不成功
返回在会话断开时在事件里 把 appl["uers_list"]中当前的 user 删除掉.