关于解决ASP环境下防止同一用户重复登录的问题的几种方案(20060110原创)

---凌冰玉   2006.01.10于郑州

一、利用access设置临时表,将用户首次登录信息记录下来,每次有用户登录时都首先检验所输入的用户名是否正在使用:

global.asa:
<script language="vbscript" runat="server">
Sub Application_OnStart
application("app")="start"
End Sub
Sub Application_OnEnd
End Sub
</script>

login.asp:                            '此为测试文件
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>请输入登录口令</title>
</head>
<body>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<form name="form1" method="post" action="firstlogin.asp">
  <table width="483" height="61" border="1" align="center">
    <tr>
      <td width="322" height="55">请输入登录口令
      <input name="password" type="text" id="password">      </td>
      <td width="145">      <input type="submit" name="Submit2" value="提交"></td>
    </tr>
  </table>
</form>
</body>
</html>

firstlogin.asp:
<!--#include file="ReloginConn.asp"-->
<%   application("app0")="start"
     response.Write(application("app")&"<br>")
 if  application("app")="start" then
     sql="delete from loginfo "
     conn.execute(sql)
  response.Write("已经成功执行清除操作:"&sql&"<br>")
  else
 end if
  %>
<% 
    session("user")=request("password")
    application("app")= session("user")
    ip=Request.ServerVariables("REMOTE_ADDR")
   ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    sql="delete from loginfo where DateDiff(""s"",cstr(logintime),cstr(now))>1200"
    conn.execute(sql)
 response.Write("已经成功执行清除操作:"&sql&"<br>")
   ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    sql="select count(*) as cnt from loginfo where usr='"&session("user")&"'"
set rs=conn.execute(sql)
   if rs("cnt")>0 then
   response.Write("<script>alert('对不起,您的账号正在其他地方被使用或者您上次登录后进行了非法的操作,请稍后再试!');</script>")
   response.End()
   else
   sql="insert into loginfo values('"&Session.SessionID&"','"&session("user")&"','"&cstr(now())&"','"&ip&"')"
   conn.execute(sql)
   response.Write("已经成功登录!:"&sql)
   end if
 set conn=nothing
%>

ReloginConn.asp:
<%
Set  Conn=Server.CreateObject("ADODB.Connection")
     Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/asptool/checkReLogin/loginfo.mdb")
     Conn.Open
%>

OprateRefresh.asp:
<!--#include file="ReloginConn.asp"-->
<%
    sql="update loginfo set logintime='"&cstr(now)&"' where usr='"&session("user")&"'"
    conn.execute(sql)
   response.Write("已经成功刷新!:"&sql&"<br>")
%>
logout.asp:写一个正常退出并清除对应记录的操作即可(可参考第二部分的logout.asp内容);

二、利用application和session模拟数组的方法共同来实现:

ReFreshAndDel.asp:
<%    DIM usrname
          usrname=request("password")''''''''''''''''''''''''''''''''''''''''''''
           Function RefreshInfo(strUsr,strTm)'刷新信息并执行删除操作的函数
                    dim  t
                    part0=split(strUsr,"+")
                    part1=split(strTm,"+")
                    for i=1 to ubound(part0)
                    tstr=part1(i)
                    t=tstr
                    tmpn=DateDiff("s",t,now())'必须预先给变量t作定义
                    if tmpn>1200 then'默认删除超过20分钟的会话
                    strUsr=replace(strUsr,"+"&part0(i),"")
                    strTm=replace(strTm,"+"&part1(i),"")
                    else
                    end if
                    next
                 RefreshInfo=strUsr&"~"&strTm
         End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以下执行清除过期连接操作
       if application("users")<>"" and application("loginTm")<>"" then
         t1=application("users")
         t2=application("loginTm")
         'response.Write("<br>not blank:"&t1&t2)
         temp=RefreshInfo(t1,t2)
         tmp=split(temp,"~")
      application("users")=tmp(0)
      application("loginTm")=tmp(1)
       else
         'response.Write("app is blank")
       end if
%>

LoginRegIntoApp.asp:

<%
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以下执行判断及登录信息记录操作
      if InStr(application("users"),usrname)>0 then
         response.Write("<script>alert('对不起,您的账号正在其他地方被使用或者您上次登录后进行了非法的操作,请稍后再试!');history.back();</script>")
         response.End()
      else
         application.lock
         application("users")=application("users")&"+"&usrname
         application("loginTm")=application("loginTm")&"+"&cstr(now())
         application.unlock
      end if
%>

UpdateLoginTm.asp:
<%  sessionV=session("yonghuming")''''''''''''''''''''''''''''
    Function RefreshTm(strUsr,strTm,usr)'刷新函数
             part0=split(strUsr,"+")
             part1=split(strTm,"+")
            for i=1 to ubound(part0)
                tstr=part0(i)
                if usr=tstr then
                   strTm=replace(strTm,"+"&part1(i),"+"&cstr(now()))
                else
                end if
            next
        RefreshTm=strUsr&"~"&strTm
   End Function
    tr1=application("users")
    tr2=application("loginTm")
   if sessionV="" then
 response.Write("<script>alert('请勿试图进行非法操作!原因:可能您的登录会话已经过期或您想单独利用本页进行非正常操作。');</script>")
   else
    tempr=RefreshTm(tr1,tr2,sessionV)
    tmpr=split(tempr,"~")
 application.lock
 application("users")=tmpr(0)
 application("loginTm")=tmpr(1)
 application.unlock
   end if
''''''''''''''''''''''''''''''''''''''''刷新操作时间以保证与session(会话)默认到期时间相等:默认为20分钟
%>


LogOut.asp:
<%    DIM usrname
          usrname=session("yonghuming")''''''''''''''''''''''''''''''''''''''''''''
           Function LogOutInfo(strUsr,strTm)'刷新信息并执行删除操作的函数
                    part0=split(strUsr,"+")
                    part1=split(strTm,"+")
                    for i=1 to ubound(part0)
                    if part0(i)=usrname then'正常删除执行退出操作的用户信息
                    strUsr=replace(strUsr,"+"&part0(i),"")
                    strTm=replace(strTm,"+"&part1(i),"")
                    else
                    end if
                    next
                 LogOutInfo=strUsr&"~"&strTm
         End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以下执行清除正常退出连接操作
       if application("users")<>"" and application("loginTm")<>"" then
         t1=application("users")
         t2=application("loginTm")
         'response.Write("<br>not blank:"&t1&t2)
         temp=LogOutInfo(t1,t2)
         tmp=split(temp,"~")
      application("users")=tmp(0)
      application("loginTm")=tmp(1)
       else
         response.Write("<script>alert('请勿试图进行非法操作!原因:可能您的登录会话已经过期或您想单独利用本页进行非正常操作。');window.opener=null;window.close();</script>")
       end if
%>

三、利用sqlserver临时表来实现。(请参考SQLSERVER相关文档)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值