动态网 > 好文章 > 正文

同一个帐号不能同时登陆的问题

时间:2017-02-18 18:17:18

〓简介〓
有点常识的人都知道本身用asp做这种功能显然有些牵强,因为他不像qq,msn或irc 聊天室那样是即时通讯,他都是靠刷新网页更改最后活动时间来获取用户是否在线的,所以您不要指望下面这片教程有多完美,我也只是把我的思维模式记录下来,有啥不对的地方还请高手们多多指教!
--------------------------------------------------------------------------------
〓正文〓
首先我先向大家介绍一下我实现这个效果的思路,如果你看过我的思路后就能理解完全没必要将这篇东西看完……

实现这个功能我只能想到两种方式来实现:
1。数据库+asp
做起来可能会复杂些,但是适合有大量登陆用户的系统里。

2。application
用application对象:如果你做的是大型社区,你可能要为每个登陆id生成一个appliaction,这样做虽然程序上设计会简单些但登陆用户过多及其耗费服务器资源,我这里决不提倡,因为appliaction对象在用户登陆时生成很容易但是要做到真正的随着用户退出系统完全释放掉,到目前我还没看到更好的方法~

因此还是让我们来看看用数据库+asp是如何实现同一个帐号不能同时登陆的问题的吧!

首先问用户建立数据库这里我们用access新建一个onlyNet118.mdb

数据表1: users 存放用户注册资料
下设数据表:uID(自动编号) userName(字符型) userPass(字符型)

数据表2: onlyLogin 存放用户临时登陆信息
下设数据表: OLname(字符型) OLtime(日期型) OLip(字符型)

数据库建好后我们直接向users表中手动添加数据 userName表添加Net118,userPass表里添加111,为了能突出我们本文讨论的重点,去掉不必要的废话,所以密码也不要加密了,用户名也自己添加~哈哈~

好了,现在数据库里面有用户数据库,下面我们来做用户登陆界面,复制下面代码存成onlyLogin.asp文件。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Net118.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_Net118
Dim Conn_T
Dim mmdd
mmdd="onlyNet118.mdb"
Set CONN_Net118 = Server.CreateObject("ADODB.Connection")
Conn_T="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&mmdd&"")
on error resume next
CONN_Net118.Open Conn_T

%>

 

下面我们做一个loginPost.asp文件也存在这个目录下,这个比较关键,仔细看下面的代码:
<!--#include file="loginCONN.asp" -->
<%
'删除maxTime时间内部活动的用户,maxTime 在loginCONN.asp文件里面已经定义好了
Conn_Net118.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_Net118,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_Net118.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_Net118,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.Net118.com
<% end if %>


如果你是细心之人马上就知道下面我么要做的是loginFrame.asp
<!--#include file="loginCONN.ASP" -->
<% CONN_Net118.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对象就放弃了这个念头,因为那样我们原本可怜的服务器一定会被拖垮~

本文地址: /article-3131368-1.shtml

上一篇:Asp生成HTML方法大全

下一篇:编写网页木马详解

相关热门
  • 婴儿重症肺炎的治疗方法

    婴儿重症肺炎的治疗方法

    婴儿重症肺炎是发病率极高的一种疾病之一,我们作为家长,当我们的孩子出现肺炎的情况,无不牵动着我们广大父母的心,为此经常半夜三更带着孩子四处求医问诊,折磨了孩子,也折磨了很多家长,那么有什么好的方法来治疗婴儿重症肺炎的情况呢?既可以解决婴儿反复发烧的问题也可以给我们的父母少些困扰,下面我们就来介绍一下

  • 婴儿肝炎综合征的治疗方法

    婴儿肝炎综合征的治疗方法

    婴儿肝炎综合征无疑是现在人们讨论的一大焦点,现如今,婴儿都会得各种各样的疾病,肝炎给我们的生活带来了巨大的苦痛和折磨,让很多的人饱受着苦难,为此很多人也四处求医问诊,但是都没有得到很好的治疗效果,那么这种疾病就没有办法治了吗?答案显然不是的,那么有什么好的方法来治疗婴儿肝炎综合征呢?下面就让我们一起

  • 宝宝神经系统发育的特点

    宝宝神经系统发育的特点

    宝宝神经系统发育对于宝宝的不同年龄应该有不同发育程度,掌握好最有效的睡眠时间不仅可以提高我们宝宝的睡眠质量,而且会促进宝宝们正常健康茁壮成长,所以掌握宝宝睡眠时间就显得非常重要,同样这也有利于我们宝宝神经系统发育,宝宝神经系统发育涉及到了很多方面的问题,例如,怎样才能促进宝宝神经系统发育正常发育呢?

  • 左侧侧脑室后角宽是什么

    左侧侧脑室后角宽是什么

    每个宝宝都是上天赋予我们的天使,也是每个家庭的希望,但是并不是每个家庭都这么幸运,孕妈妈在宝宝还没出生的时候就检查出来胎儿左侧侧脑室后角宽,这对于每个家庭来说无疑是一个噩耗,但是也并不是胎儿左侧侧脑室后角宽就等于是没有了希望,还要看在宝宝成长过程中会不会被吸收掉。那么到底左侧侧脑室后角宽是什么呢?一

  • 婴儿锁骨骨折怎么办

    婴儿锁骨骨折怎么办

    对于新生婴儿来说他们的身体是非常刺弱的,如果是稍微照顾不好就会出现各种各样的问题,而在婴儿出生的时候如果是医生没有做好护理措施的话很容易就会导致婴儿锁骨骨折的情况,不过好在婴儿锁骨骨折对于婴儿本身并不会有什么大的伤害,所以知道婴儿锁骨骨折怎么办,及时的为孩子进行治疗才是家长朋友应该关心的事情。对新生

  • 满月宝宝黄疸正常值是多少

    满月宝宝黄疸正常值是多少

    满月宝宝黄疸正常值是多少?新生儿的黄疸症状是非常常见的,那么满月宝宝黄疸正常值是多少才是正常的呢?超出多少又是不正常的呢?家长对这种指标应该是非常了解的才对。满月宝宝黄疸正常值影响到了宝宝黄疸的治疗。黄疸一般分为生理性黄疸与病理性黄疸,只要超出生理性黄疸的范围就称为病理性黄疸。满月宝宝黄疸正常值分析

  • 宝宝大便果冻样粘液是为什么

    宝宝大便果冻样粘液是为什么

    很多的宝宝的大便出现了问题,那么很容易就会是宝宝患上了某些疾病导致的,因此出现了这个问题的宝宝就需要及时的进行治疗来保证健康,那么宝宝大便果冻样粘液是为什么呢?那么下面我就为大家来介绍一下宝宝大便果冻样粘液的问题吧。有时候人的肠道需要自我清理,也会出现这种现象。建议观察一两天,如果不再出现这种情况,

  • 宝宝大便糊状是为什么呢

    宝宝大便糊状是为什么呢

    很多的时候宝宝的大便出现了问题很有可能是消化系统导致的,还有可能就是宝宝患上了某些疾病,因此宝宝大便出现了问题就需要及时的进行治疗,那么宝宝大便糊状是为什么呢?那么下面我就为大家来介绍一下这个问题吧。小儿由于年龄、饮食、排便习惯等的不同,每天排便次数可以不尽相同。婴幼儿粪便的次数和性质常反映着小儿胃

  • 宝宝黄疸反复的原因有哪些呢

    宝宝黄疸反复的原因有哪些呢

    宝宝黄疸反复的原因有哪些呢?宝宝黄疸反复是困扰很多宝妈的问题之一,宝宝出现黄疸症状的话,家长都会十分担心的,特别是宝宝黄疸反复出现,面对宝宝黄疸反复的症状,家长要知道为什么会出现反复发作,找到原因后,才能够更加彻底的进行治疗。宝宝黄疸反复是因为新生儿溶血造成的,常见于母亲为O型血,宝宝为其他血型而造

  • 关于宝宝黄疸照蓝光一些知识介绍

    关于宝宝黄疸照蓝光一些知识介绍

    由于会出现很多不同的情况,宝宝在出生后很容易出现黄疸的现象,那么此时医生就会采取照蓝光的治疗。当妈妈看到孩子要照蓝光不免心中都会非常的痛苦。那么你们对孩子照蓝光你们又了解多少呢?下面小编就关于宝宝黄疸照蓝光一些知识来给各位来个介绍。因为种种原因,宝宝在妈妈肚子里出来时,黄疸值都会不正常,通过蓝光治疗

  • 宝宝一个月了还有黄疸怎么回事

    宝宝一个月了还有黄疸怎么回事

    现在很多新生儿多出现了黄疸的症状,出现黄疸的症状代表着宝宝新陈代谢不是很稳定。家长也很是担心,不知道该怎么处理这种病。那么今天就来为大家介绍一下两个月宝宝黄疸不退应该怎么进行救治。那么到底是什么原因引起的黄疸呢?般情况下没事的,黄疸分为生理性黄疸和病理性黄疸。新生儿黄疸一般分为生理性黄疸和病理性黄疸

  • 宝宝拉果冻状大便是怎么回事呢

    宝宝拉果冻状大便是怎么回事呢

    很多的宝宝大便出现了问题,那么很容易就是宝宝患上了某些疾病或者是其他的原因导致的,因此有很多的宝宝大便出现了果冻形状的,让很多的父母担心,那么宝宝拉果冻状大便是怎么回事呢?那么下面我就为大家来介绍一下这个问题吧。一开始拉的也是有点像鼻涕一样有透明状的东西,慢慢的就拉水和泡沫了,而且是绿色的。去十七冶

  • 满月婴儿黄疸该如何进行治疗呢

    满月婴儿黄疸该如何进行治疗呢

    很多的宝宝出现了黄疸不正常的现象,严重的影响到了宝宝的健康,因此很多的家长感到担心,不知道该如何帮助宝宝进行治疗才能够保证宝宝的身体的健康,那么满月婴儿黄疸该如何进行治疗呢?那么下面我就为大家来介绍一下这个问题吧。新生儿黄疸症大部分新生儿在出生后的一周内可能出现皮肤黄染,这是由于体内胆红素沉积在皮肤

  • 三个月宝宝干呕该怎么办呢

    三个月宝宝干呕该怎么办呢

    很多的宝宝出现了干呕的现象发生,严重的影响到了宝宝的身体的健康的问题,因此很多的父母对宝宝出现了这个问题感到担心,是否会影响到宝宝的健康,那么三个月宝宝干呕该怎么办呢?那么下面我就为大家来介绍一下这个问题吧。幼儿出现干呕有的是由于食道下端括约肌的功能缺陷,引起胃液或者胆汁还流食道一起的临床征候群,部

  • 宝宝拉果冻样大便是为什么呢

    宝宝拉果冻样大便是为什么呢

    很多的时候宝宝的大便出现了问题,那么很有可能是宝宝患上了某些疾病导致的,因此宝宝大便出现了问题就需要及时的进行检查和治疗,那么宝宝拉果冻样大便是为什么呢?那么下面我就为大家来介绍一下宝宝大便出现问题的解决的方法吧。果冻状大便以及呈鼻涕果冻状考虑肠炎或者细菌性痢疾。、建议进一步化验大便常规确诊看看,需