如何实现一个用户登录后,禁止其他用户用同一ID登录,
请高手帮帮忙!需要用到什么样的对象和技术路线!
急ing!老板催ing! 谢谢ed先!

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3867/3867653.xml?temp=.6136743呵呵,其实这个问题就这样的,你看,这个你看了后你就自己去构思一下思路吧,都在里面了,HOHO
      

  2.   

    http://dotnet.aspx.cc/ShowDetail.aspx?id=CF5FFABC-CFE1-4368-3C13-9B4FCD7C7168
      

  3.   

    http://blog.csdn.net/21aspnet/archive/2005/03/15/319885.aspx
      

  4.   

    在不同的电脑上实现单点...alexzhang00()就不行了。
      

  5.   

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

  6.   

    数据库中增加一个字段,eg: in_state 0代表第一个登陆,1代表此帐号已经登陆。
    登陆后判断in-state,如果为0则登陆,如果为1则不能登陆。
    退出时再还原
      

  7.   

    试试用Application对象保存已登陆用户ID
      

  8.   

    jhqjhq(逗号)的方法有问题,万一这人登陆了,意外情况离开了,数据库的记录仍然是在线的记录,那他这个id岂不是永远也上不去了!
      

  9.   

    flyinbob12349878(似水年华)的方法也有问题,一登陆就设定cache的过期时间是20分钟(假设session的过期时间是默认的)
    但如果该用户20分钟后还在线呢?
    而cache已经被清了
    这时候不是又可以登陆了吗?如果在点击离开按钮后删除缓存,应该怎么做????
    在同一台电脑上是可以了,但我在这登陆了,另一个人也用相同的id在不同的地方登陆怎么控制?
      

  10.   

    孟大哥的那个页算是个方法,但是不是很完善!
    另外你可以建立一张数据表
    如楼上所说:数据库中增加一个字段,eg: in_state 0代表第一个登陆,1代表此帐号已经登陆。
    登陆后判断in-state,如果为0则登陆,如果为1则不能登陆。
    退出时再还原这个页可以
      

  11.   

    这个我倒是有一个思路:
    系统可以建一个SysUser ----存储系统用户的一些信息
    再建一个      UserOnline  ------存储登陆用户的帐号、登陆时间、ip等等一个用户登录先验证系统帐号的准确性,再看是否在UserOnline中存在记录
    如果存在说明已经用同样帐号登陆,不允许登陆(这个应该小菜一碟)
    如果不存在则允许登陆,同时在UserOnline  中插入记录。欢迎大家共同探讨~~
      

  12.   

    Application的好处是不用经过数据库,数据库加字段的好处是服务重启后登录情况还在。一般用不着,除非是一些真的非常长效的登录(这种情况也可结合cookie和Application解决)。
    Session是不行的,Cathe时效太短。
    我的做法是建一个登录ID的list,在服务启动时就加载到Application(此时当然是空的)。当有ID要登录时就先查Application的这个list中有没有,没有就给登,之后在Application中加上。
    单击离开按钮时触发一个函数从Application中删除该ID,Session过期时也可调用这个函数删除登录。防止在网吧使用忘记登出导致再也登不进的情况……如果用数据库里长久存储登录状态的方法,更应注意Session过期后一定也要删掉登录信息,另外还要记得服务加载时把数据库里所有的登录状态都设成不登录,以防止意外关机的情况
      

  13.   

    Session_OnStart()
    {
    //检查数据库中是否有本帐号的登陆信息
    //在数据库中注册本帐号的登陆信息
    }
    Session_OnEnd()
    {
    //删除数据库中的本帐号登陆信息
    }
      

  14.   

    楼上的关键是在那个session文件里面写代码来查看数据库
      

  15.   

    我们公司做了一个OA,我的做法是在数据库的用户表中添加两个字段,记录用户是否登录以及最后一次的登陆IP,在用户登录的时候做判断,如果用户是登陆状态,就判断登陆IP是否相同,如果相同则允许登陆,如果不同提示此帐户已在使用中。为了防止在同一台机器上登陆,系统在登陆后打开一个命名的窗口,如果用户再次登陆,也只显示这一个窗口。为了防止用户非正常退出,在session_end里写入了修改数据库中用户在线状态的程序,session过期时间为20分钟。
      

  16.   

    这个问题我们公司的一个客户要求过
    我是这样实现的
    1.在数据库增加一个表记录在线情况statid
    username
    lastactive
    cookiekey
    2.用cookiekey标识用户身份
    可以把cookiekey保持时间设的长些,以保持一定时间内都有标识(保持100年也行)
    为什么不用IP呢,我们考虑的是内网与外网就没用
    ---------
    登录:
    检查statid,如果存在且cookie不同,且用lastactive用现在时间作比较,如果是允许自动掉线时间内的说明不能登录
    -------------
    登录以后写入cookie
    每次访问刷新lastactive
    -------------如果超时了,其它用户还是可以登录
    你可以设置这个时间长短最好做一个KILLID的页
    因为单一登录的目的是防止多用户操作出现不协调才存在的
      

  17.   

    我的方法是不用cookies,直接用数据库,建一个表(userid,lastdate)设置一个时间间隔(建一个frame里面有个每隔X分钟向数据库更新当前时间)
    用户登录时判断是否有当前用户记录,1:有,则判断getdate()是否大于lastdate为X分钟,2.没有则为没在线.这样则可以表明当前用户是否在线.用这个思路.看看如何中.
      

  18.   

    数据库中增加一个字段,eg: in_state 0代表第一个登陆,1代表此帐号已经登陆。
    登陆后判断in-state,如果为0则登陆,如果为1则不能登陆。
    退出时再还原
    -----------------------------不支持这种方法,
    如果非法掉线了怎么办,那不是永远为0?我想如果将登录标志就放在内存呢?
      

  19.   

    完全支持 murasaki(风羽) 的方法
      

  20.   

    murasaki(风羽) 的方法可行,注意在Application中修改检查登录信息时要Application.lock防止冲突
      

  21.   

    我的想法和   风习习 一样    点击确定时
        先在 appl["user_list"] 时查找。。看有没有 user_box.text中的内容
        如果有。报错
        没有...联接数据库验证.成功
        appl["uers_list"] = appl["uers_list"] +  user_box.text
        不成功
         返回在会话断开时在事件里 把 appl["uers_list"]中当前的 user 删除掉.