分享
 
 
 

[ASP技术]asp防止同时登陆的问题

王朝asp·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

实现这个功能可有两种方式:

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)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有