是这样.现在在库里有一个表专门存登陆后的用户名.当一个账号登陆后.其它人用此账号登陆会提示不登陆.或是强行登陆如果强行登陆的话.怎么样使正在登陆的人下线?
现在的用户在线状态除了表里有个用户名.还有一个session记录登陆状态.30分钟超时.如果超时后如果使表里记录的用户名清除掉?

解决方案 »

  1.   

    首先这个表中只有一条记录,就是记录登陆了的用户,如果不想让人家再登陆的话,就对这个表不做操作,如果要强行登陆的话,就Update这个表.
      

  2.   

    首先这个表中只有一条记录,就是记录登陆了的用户,如果不想让人家再登陆的话,就对这个表不做操作,如果要强行登陆的话,就Update这个表.
      

  3.   

      单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
      企业应用集成(EAI)。企业应用集成可以在不同层面上进行:例如在数据存储层面上的“数据大集中”,在传输层面上的“通用数据交换平台”,在应用层面上的“业务流程整合”,和用户界面上的“通用企业门户”等等。事实上,还用一个层面上的集成变得越来越重要,那就是“身份认证”的整合,也就是“单点登录”。
      单点登录的技术实现机制:当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。
      可以看出,要实现SSO,需要以下主要的功能:
      所有应用系统共享一个身份认证系统;
      所有应用系统能够识别和提取ticket信息;
      应用系统能够识别已经登录过的用户,能自动判断当前用户是否登录过,从而完成单点登录的功能。
      其中统一的身份认证系统最重要,认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。整个系统可以存在两个以上的认证服务器,这些服务器甚至可以是不同的产品。认证服务器之间要通过标准的通讯协议,互相交换认证信息,就能完成更高级别的单点登录。
      

  4.   

    设计在线表吧。字段为:UId(用户唯一id),logintime(登陆时间),IdCode(随机产生的一个数字【或者是GUID这种的,怕数字重复】)
      

  5.   


    我是想防止同一个账号在两个不同的地方登陆.如果A先登陆的话.那B在用A的账号登陆时就算是update的话更新后不还是这个账号吗.更新前后的信息是一样的.要怎么判断?
      

  6.   

    设计在线表吧。 
    字段为:UId(用户唯一id),lastactivity(登陆时间),IdCode(随机产生的一个数字【或者是GUID这种的,怕数字重复】) 
      

  7.   

    遍历所有session可以解决在线一人的情况,时间设置20分就可以了,再进行对表的操作
      

  8.   

    web系统的单人登陆一般都是这么设计的,数据库用户表中设置一个时间,当用户登陆后,客户端定时(比如1分钟)更新这个时间,如果你登陆的时候发现现在时间和系统记录的时间小于1分钟,可以认为其他人已经登陆了。让其他人断线,winform比较容易,web系统的话比较麻烦。
      

  9.   

    登录时往一个表里记录这个用户的一个GUID,SESSION里的GUID与数据库里的保持一致,每次登录更新这个GUID。  然后要定时判断这个用户SESSION里的GUID与数据库里的是否一致,不一致,则表示已在别处登录了。 而且在每次与服务器交互之前都要判断这上GUID是否一致。
      

  10.   

    我觉得记录GUID的方法比较好.这样就不用定时去检测了.否则在手机上看网页的话定时好像比较麻烦.
    使对方下线好像不太容易.不过可以等他再有动作的时候提醒他已经在别处登陆了.这样应该就可以了
      

  11.   


    这里提供一个简单的思路, 用户登录了,                
    string uer = Convert.ToString(Cache[strValue]);//读取Cache中的用户ID
    if (uer == null || uer == String.Empty)//如果用户ID不在,则将其存入Cache中.
    {
    TimeSpan SessTimeout = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 1);//设置超时时间
    HttpContext.Current.Cache.Insert(strValue, strValue, null, DateTime.MaxValue, SessTimeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);//加入Cache中
    -- 接着在Cache中对应其用户ID在时间基础上递增的验证码,作为用户进入系统后,来执行其它操作时作验证.比如,是个数组arrary(userID,Authentication),userID是用户ID,Authentication是在时间基础上递增的验证码.
    }else
    {
     -- 如果Cache数组中已经存在该用户的UseID,那么提示用户是强制其下线还是返回. 如果另一处登录者强制下线,则修改其"Authentication".
    }over那么如果你是用的session验证每个页面的话,那么将session中的值加一项"Authentication"来验证用户的每一个操作,这样就可以达到你所说的效果了.
      

  12.   

    我想了一个比较简单的方法.看看行不行登陆后记录 用户ID 和一个唯一标识 到表中
    当其它人用此用户ID在别处登陆时.检查用户ID如有重复.再检查唯一标识.如果唯一标识不同.刚提示已经有人登陆了.然后重新唯一标识.登陆.原本登陆的人当有操作时发现唯一标识被更改了.就提示已经在别处登陆我觉得这种方法是最简单的了.不知道可不可行.不过有几个问题.这样的话在用户每次操作页的时候肯定都要查数据库 会不会影响性能.
    如果断线.死机.怎么办.我想的是 服务器定时如果半小时内没有动作.自动清除表中登陆信息.这个要怎么实现?
      

  13.   

    在数据库中加一列state 
    当进入登陆页面 输入ID后 触发一个事件 查找state值是否为0 不为0则把该ID对应的state值更新成0
    点登陆后 更新成一个特有的值  比如说 可以是时间  用session保存
    然后在每个页面的Page_Load事件里 查找一次state  如果state等于该session值 则没任何操作  如果不是 就代表在别处登陆了
    就提示在别处登陆 然后清空session   返回到登陆页面 这样处理 如果断线 死机  都没关系 此方法为本人 暂时想出来的。未经过实际使用。只做参考。。
    如果有什么不明白的 315470790 加这个问
      

  14.   

    更新本人在38楼所写的
    点登陆按钮时 先判断该ID和PWD是否正确 如果正确  则把state的值更新成一个特有的值  比如说 可以是时间  用session保存 
    然后在程序的每个页面的Page_Load事件里 查找一次state  如果state等于该session值 则没任何操作  如果不是 就代表在别处登陆了 
    就提示在别处登陆 然后清空session  返回到登陆页面  只要一操作页面 就可以实现这个效果  当然也可以写触发器。。这样处理 如果断线 死机  都没关系 
    此方法为本人 暂时想出来的。未经过实际使用。只做参考。。 
    如果有什么不明白的 315470790 加这个问
      

  15.   

    不同的电脑可以记录IP,USER,logTime.
    1.用户登录时检查有没有相同USER及IP.有相同记录就提示不能再登录。
    2.强制下线可以设定session["userId"]=null
      

  16.   

    不同的电脑可以记录IP,USER,logTime.
    1.用户登录时检查有没有相同USER及IP.有相同记录就提示不能再登录。
    2.强制下线可以设定session["userId"]=null