1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

asp防止同时登陆的问题 ZT

本帖由 小叶2006-01-10 发布。版面名称:后端开发

  1. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    实现这个功能可有两种方式:
    1。application
    用application对象:如果做的是大型社区,可能要为每个登陆id生成一个appliaction,这样做虽然程序上设计会简单些但登陆用户过多及其耗费服务器资源,这里决不提倡,因为appliaction对象在用户登陆时生成很容易, 但是要做到真正的随着用户退出系统完全释放,到目前还没看到更好的方法~
    <%
    .....取用户名username.....
    if Application(username)<>"" then
    response.write "该用户已经登录"
    response.end
    end if
    Application(username)=username '存入该用户的用户名
    %>
    在global文件中加上session onend事件,下线时Application("isuserlogin")=false
    此外还要检测是否吊线,有专门的办法,是server对象里的某项
    (参: http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=815)
    2。数据库+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>禁止同一账号不同地区同时登陆</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 %>

    登陆成功后叶面会跳转到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 %>
    您没有登陆哈
    <% 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>

    到此为止程序就完成了,这个程序的关键就是判定用户是否在线
    (参: http://community.csdn.net/Expert/topic/4460/4460199.xml?temp=1.540774E-02)
     
  2. loveuni

    loveuni New Member

    注册:
    2006-02-06
    帖子:
    11
    赞:
    0
    我要慢慢看了
     
  3. wm_chief

    wm_chief New Member

    注册:
    2005-09-05
    帖子:
    17,890
    赞:
    46
    哦!!
     
  4. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    :eek:
     
  5. 老林

    老林 New Member

    注册:
    2005-09-06
    帖子:
    10,580
    赞:
    36
    同3楼