用session保存信息。
用SESSION判断登陆信息。

解决方案 »

  1.   

    在数据库中设一个字段,每当有新的登录者登陆,就往数据库这个字段写入随机信息,比如是ip地址和系统时间的组合,然后再存入Session,随后在每个执行页面前先判断Session和数据库中该字段值是否相等,如果不等就说明有新的用户登陆,则注销Session,退出!不过这样子可能比较耗资源
      

  2.   

    当A登陆,注册一个SESSION和一个COOKIE。
    当B登陆,也注册一个SESSION和一个COOKIE。
    当A再进行网站的操作的时候(非登陆操作),利用SESSION和COOKIE检测其是否为B,如不是,注销COOKIE。。OK,完成。
      

  3.   

    实现这个功能我只能想到两种方式来实现:
    1。数据库+asp
    做起来可能会复杂些,但是适合有大量登陆用户的系统里。2。application
    用application对象:如果你做的是大型社区,你可能要为每个登陆id生成一个appliaction,这样做虽然程序上设计会简单些但登陆用户过多及其耗费服务器资源,我这里决不提倡,因为appliaction对象在用户登陆时生成很容易但是要做到真正的随着用户退出系统完全释放掉,到目前我还没看到更好的方法~因此还是让我们来看看用数据库+asp是如何实现同一个帐号不能同时登陆的问题的吧!首先问用户建立数据库这里我们用access新建一个onlyTOL8.mdb数据表1: users 存放用户注册资料
    下设数据表:uID(自动编号) userName(字符型) userPass(字符型)数据表2: onlyLogin 存放用户临时登陆信息
    下设数据表: OLname(字符型) OLtime(日期型) OLip(字符型)数据库建好后我们直接向users表中手动添加数据 userName表添加TOL8,userPass表里添加111,为了能突出我们本文讨论的重点,去掉不必要的废话,所以密码也不要加密了,用户名也自己添加~哈哈~好了,现在数据库里面有用户数据库,下面我们来做用户登陆界面,复制下面代码存成onlyLogin.asp文件。
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>TOL8.COM禁止同一账号不同地区同时登陆</title>
    </head>
    <body>
    <form name="form1" method="post" action="loginPost.asp">
    用户名:<input name="userName" type="text" id="userName" size="15" maxlength="5">
    密码:<input name="userPass" type="password" id="userPass" size="15" maxlength="15">
    <input type="submit" name="Submit" value="Login">
    </form>
    </body>
    </html> 
    完成后在新建一个loginCONN.asp文件复制下面的代码保存!是连接数据库的,这个我就不多解释了……
    <%
    Dim CONN_TOL8
    Dim Conn_T
    Dim mmdd
    mmdd="onlyTOL8.mdb"
    Set CONN_TOL8 = Server.CreateObject("ADODB.Connection")
    Conn_T="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&mmdd&"")
    on error resume next
    CONN_TOL8.Open Conn_T %>下面我们做一个loginPost.asp文件也存在这个目录下,这个比较关键,仔细看下面的代码:
    <!--#include file="loginCONN.asp" -->
    <%
    '删除maxTime时间内部活动的用户,maxTime 在loginCONN.asp文件里面已经定义好了
    Conn_TOL8.Execute("Delete From onlyLogin where DATEDIFF('s',OLtime, now()) > "& maxTime & "")
    '================================================================
    Dim rs, ts, txt, sql, userName, userPass
    if Request.Form("Submit")="Login" then
    userName=Request.Form("userName")'获取表单用户登陆名
    userPass=Request.Form("userPass")'获取表单用户登陆密码
    '由于我们这里讨论的不是安全问题所以用户密码都没有加密
    Set rs = Server.CreateObject("ADODB.RECORDSET")
    sql="SELECT * FROM users where userName = ' "& userName & "'  and userPass = ' "& userPass & "'"
    rs.Open sql, CONN_TOL8,1,1
    IF not rs.eof then
    Call isOK(userName) ' 用户名密码正确调用次过程,isOK将会在下面的程序中定制。
    else
    Response.Write("<a href=javascript:history.go(-1)>用户名或密码错误</a>")
    Response.End()
    end if
    rs.Close
    Set rs=Nothing
    end if
    Sub isOK(userName)
    Dim Olip ' 数据库中当前登陆用户名保存的ip
    Dim Oltime ' 数据库中当前登陆用户名保存的最后刷新网页的时间,是计算用户是否在线的重要数据。
    Dim OLip1 ' 记录当前用户登陆ip,用来区分是否为同一用户的标示
    OLip1=Request.ServerVariables("REMOTE_ADDR")'取得提交登陆信息用户的IP
    Set ts=Conn_TOL8.execute("Select * FROM onlyLogin WHERE OLname='"& userName & "'")
    if not ts.eof then ' 查询数据库是否有此用户的登陆过的信息
    OLtime=ts("OLtime")
    OLip=ts("OLip")
    if OLip1<>OLip and DateDiff("s",OLtime,now()) < maxTime then 
    '上句判断如果提交登陆用户ip不是数据库中最后纪录的用户ip并且
    '用户的最后活动时间和当前时间相隔并没超过规定的秒数则确认此用户当前在线
    Response.Write "<a href=javascript:history.go(-1)>此用户目前在线,你无法从其他地方登陆此账号!</a>"
    Response.End()
    else
    '否则的话判定登陆成功付值给session
    Session("lgName")=userName
    Session("lgPass")=userPass
    Response.Redirect "loginOK.asp"
    Response.End
    end if
    else
    '如果数据库没有次登陆用户纪录则执行下面的语句
    Dim ls
    Set ls=Server.CreateObject("ADODB.RECORDSET")
    ls.Open"Select * From onlyLogin",CONN_TOL8,2,2
    ls.ADDNEW
    ls("OLname")=userName
    ls("OLip")=OLip1
    ls("OLtime")=NOW()
    ls.UPDATE
    ls.Close
    Set ls=Nothing
    '判定登陆成功付值给session
    Session("lgName")=userName
    Session("lgPass")=userPass
    Response.Redirect "loginOK.asp"
    Response.End
    end if
    End Sub %>如果你看得懂asp文件一看便知道登陆成功后叶面会跳转到loginOK.asp下面我们马上看看这个叶面的代码吧
    <style type="text/css">
    <!--
    body {background-color: #FF9900;}
    -->
    </style>
    <% IF Session("lgName")<>"" then %>
    您登陆成功了!!!下面是潜入网页内的iframe为的是在规定的时间刷新网页向服务器报告你是否在线
    为了便于区分,frame网页我们采用了白色作为底色
    <iframe border=0 name=new_date marginwidth=0 framespacing=0 marginheight=0 src="loginFrame.asp" 
    frameborder=0 noResize width=100 scrolling=no height=30 vspale="0"></iframe> 
    <% else %>
    您没有登陆哈 欢迎光临http://www.TOL8.com
    <% end if %> 
    如果你是细心之人马上就知道下面我么要做的是loginFrame.asp 
    <!--#include file="loginCONN.ASP" -->
    <% CONN_TOL8.Execute("Update onlyLogin Set OLtime='"& NOW() & "'  where OLname = ' "& Session("lgName") & "'") %>
    <html><head><meta http-equiv="refresh" content="<%=(maxTime-5)%>; url=""></head></html>好了到此为止我们的程序就完成了,这个程序的关键就是判定用户是否在线,而我也是无可奈何的是用了FRAME把定时刷新确定用户在线的关键性叶面嵌套在主程序的叶面里,实际的操作中你可以把那个iframe的宽和高改为0让一般用户看不到,或者让主程序的网页底色和那个嵌套进来的定时刷新的网页一样就ok了。
    前不久在讨论区看到有人说用session和cookies之类的东西也能判定,这显然是不可能的呀,因为他们生成的对象都是对自己起作用的,其数据内容根本无法和其他用户共用。appliaction应该是实现这一目的的另一种方法,但是我一想到如果同是有很多用户登陆要为每个用户生成至少一个到三个appliaction对象就放弃了这个念头,因为那样我们原本可怜的服务器一定会被拖垮~此教程首发www.TOL8.com
    其他网站转载收录请注明出处: 今晚在线 by 我容易么我
    高手如有其他高见联系我QQ:24733500 或到 http://TOL8.com/bbs 的ASP版区=================================
    如果你想先测试一下他的效果,拉上两个以上的朋友一起到这里登陆
    登陆名:TOL8 
    密码:111
    演示地址:http://www.TOL8.com/web/asp/onlyLogin.asp 下载源文件:http://www.tol8.com/web/asp/onlyLogin.rar
      

  4.   

    思路:
         
           1。设定session time out 为5分钟
           2。在user表中加isLogin bit 型字段。缺省为0
           3。用户登录时检查isLogin ,如果已登录就不让进。退出
           4。登陆完成后修改isLogin为1
           5。在页面导航条做个loginOut连接,loginOut用来将session end
           (如果用户是关机、断电、直接关闭浏览器的话,在5分钟之内将无法登录)
           6。在global.asa中编写session_onEnd函数,将 isLogin字段改为0
      

  5.   

    同意Amely(海贝),session和cookie根本不可能,因为session是会话对象,session的sessionid就相当于每个会话的编号,而每个用户的session对像变量及属性都是不相同的,而且只能会话者自己访问!简单的说就好比独享,cookie也是同样的道理!
      而application是任何会话者都可访问到的,就好比共享。数据库也是同样的道理!
      思想:当用户登录后就记录信息到application或数据库中,而在登录时则检查application或数据库是有记录登录信息,如果有则不能登录,否则可登录。而在用户离开或者结束会话时就删除在线信息!
      

  6.   

    倒,怎么asp都出来了?
    把session数据存到数据表里一切就都解决了,这时候session可以作为全局变量来检索,也可作为每个用户的特有变量。还能统计阅读同一个标题的所有人。很多论坛都这样实现了。
    登录的时候查询一下session表,看看有没有在有效期内的session存在即可。
    因为session的机制是自动更新它的有效期的,所以不用定时刷新。
    这是最完美的解决方案
      

  7.   

    在楼上各位大侠的启发下,小弟想出如下方法,不知对否:
    用户名:name  密码:pwd  ,并设登录表,字段为:用户ID(usr_id),SESSION ID(sess_id)
    1、提交name和pwd;
    2. 验证name和pwd在数据表中是否匹配;
    3. 若未通过验证,转1之前,重输用户名密码;
       否则,转4;
    4. 将usr_id登记为session变量,检查数据表中,该用户ID是否存在:
       若存在,则修改其sess_id为当前值;(此处有个问题,就是当修改完以后,怎样及时通过已登录用户已被赶下)
       若不存在,则将usr_id,sess_id插入.当用户访问页面时,先判断其usr_id和sess_id是否和数据表中相符.不过这样似乎每次都要访问数据库,效率也许会下降
      

  8.   

    怎样查有效期内的session?能查到的话用户ID都不用记录的
      

  9.   

    “如果一个地方在线,另一个地方再登录,就会逼迫前者下线”
    用数据库或文件或共享内存(php没有asp的application)保存以下两个指标
    1、session_id
    2、用户名用户登陆时,检查该用户是否已登陆。如登陆则修改该用户名的session_id为当前的session_id
    其他访问时,检查当前session_id是否在其中。若不在则注销当前session,并要求重新登陆
      

  10.   

    这还不简单,用户登录时数据库与SESSIO同时记录登录时间,用ifram设定时间判断SESSION值跟数据库是否相同,不相同就T人