关于用户登录和注销的问题。
小弟需要在用户登录是记录下登录时间和IP,在注销时记录注销时间。
可是又怕用户不注销,直接关浏览器。在Session_OnEnd里又无法进行数据库操作。
用户登录时我不允许重复登录,我是判断注销时间为在线。万一用户不注销,下次他就进不来了,我该怎么办,给点建议,先给20分,不够再加。
问题点数:20、回复次数:16Top
1 楼andyrew(长江后浪)回复于 2001-07-20 16:03:34 得分 5
可以把session.time设得短一些,要Session_Onend中删除用户Top
2 楼uhoo(幽狐)回复于 2001-07-20 16:05:57 得分 5
加上一个函数
<script language="javascript">
function leave()
{
window.location("注销文件");
}
</script>
<body Onunload="leave()">Top
3 楼andyrew(长江后浪)回复于 2001-07-20 16:10:08 得分 0
这样不行吧,如果一个session同时打开两个窗口,当关闭其中一个时,另一个不也就完完了。Top
4 楼uhoo(幽狐)回复于 2001-07-20 16:11:56 得分 0
那他首先就是不法分子Top
5 楼eastliangliang(青苹果:拒绝羊皮的狼)回复于 2001-07-20 16:43:04 得分 0
问题是在Session_OnEnd里无法修改注销时间。
怕用户不注销,或是突然停电。下次用户就进不来了。Top
6 楼andyrew(长江后浪)回复于 2001-07-20 16:53:45 得分 0
可以的,在session_onend里,update数据库,修改时间。Top
7 楼eastliangliang(青苹果:拒绝羊皮的狼)回复于 2001-07-20 17:12:18 得分 0
andyrew(java):帮我看看代码吧。
<script language="vbscript" runat="server">
Sub Application_OnStart
End Sub
Sub Application_OnEnd
End Sub
Sub Session_OnStart
End Sub
Sub Session_OnEnd
Application.lock
dim conn
dim connstr
on error resume next
connstr="DSN=aaa;uid=gwpickup;pwd=gwpickup"
set conn=server.createobject("ADODB.CONNECTION")
conn.open connstr
if err.number<>0 then
err.clear
set conn=nothing
response.write "数据库连接出错!"
Response.End
end if
yonghuming=session("user")
zhuxiaoshijian=cstr(now())
sql="update login set 注销时间='"+zhuxiaoshijian+"'where 用户登录名='"+yonghuming+"'and 注销时间='在线'"
' response.write sql
conn.execute sql
if err.number <> 0 then
response.redirect "error.asp?errmsg=cstr(err.description)"
'else
' response.redirect "login/logoutok.asp"
' response.end
end if
conn.close
set conn=nothing
Application.unlock
End Sub
</script>
不过感觉总执行不到。Top
8 楼neweb(永不言败)回复于 2001-07-20 22:44:42 得分 5
eastliangliang(青苹果) :
你的代码有问题,这句:yonghuming=session("user"),
当用户停电20分钟后将执行到,而这时 session("user") 已经读不到值了,
我建议:用户登录时,把所有 yonghuming 放入 application 中,Session_OnEnd时检查每个用户的在线状态,如果不在线则注销,可参考聊天室中聊神掉线时的做法,我就不帮你找代码了,呵呵.
Top
9 楼eastliangliang(青苹果:拒绝羊皮的狼)回复于 2001-07-21 10:43:08 得分 0
neweb(永不言败):
我的时间挺紧的,我对ASP不是很熟,麻烦写个大概程序,解决问题后,我会加分的。Top
10 楼eastliangliang(青苹果:拒绝羊皮的狼)回复于 2001-07-21 17:30:30 得分 0
我的程序又出了问题。
global.asa中,Session_OnStart可用,Session_OnEnd死活不执行,什么问题?
Session确实已经过期了。
Top
11 楼stanely(俺是邢她汉子)回复于 2001-07-21 20:49:27 得分 0
不能再次登陆?为什么不用session.timeout?
我觉得是你的设计初衷有问题。条条大道通Roma呀!
Top
12 楼eastliangliang(青苹果:拒绝羊皮的狼)回复于 2001-07-22 08:47:34 得分 0
用了,现在的问题是:我不允许用户同时登录两次以上,所以在后台数据库里判断用户是否在线。
用户非法退出,注销时间仍为在线,所以下次他进不来了。有更好的方法判断吗?Top
13 楼eastliangliang(青苹果:拒绝羊皮的狼)回复于 2001-07-22 16:20:01 得分 0
大家过来看一下:
global.asa:
<script language="vbscript" runat="server">
Sub Application_OnStart
dim nowuser()
Application("visitor")=1
'Application("nowuser")="a"
End Sub
Sub Application_OnEnd
Application("visitor")=1
'Application("nowuser")="a"
End Sub
Sub Session_OnStart
session.timeout=1
Application("visitor")=Application("visitor")+1
End Sub
Sub Session_OnEnd
redim nowuser(Application("visitor"))
Application("visitor")=Application("visitor")-1
nowuser=Application("nowuser")
for each item in nowuser
if item=session("user") then
item=""
end if
next
Application.lock
Application("nowuser")=nowuser
Application.unlock
End Sub
</script>
login.asp:
<%user=request.form("user")
pwd=request.form("pwd")
if user="" then
response.redirect "login.htm"
end if
set rs=server.createobject("adodb.recordset")
sql="select * from yonghu where 用户名='"&user&"' and 密码='"&pwd&"'"&"and 是否可用=1"
rs.open sql,conn,3,2
if not rs.eof then
used=0
num=Application("visitor")
redim nowuser(num)
nowuser=Application("nowuser")//此为15行
Microsoft VBScript 运行时错误 错误 '800a000d'
类型不匹配
/guanli/login/login.asp, 行15
Top
14 楼eastliangliang(青苹果:拒绝羊皮的狼)回复于 2001-07-22 16:23:26 得分 0
坏了,Sub Application_OnStart里有注释,不过我去了注释也不对,我都调试晕了。Top
15 楼geyunpeng(Penny)回复于 2001-07-22 16:30:48 得分 5
无论怎么样
Session.OnEnd总是会执行的
它是运行在服务器上的呀!!!
和你浏览器怎么关的没有关系
如果你正确注销的,则通过Session.Abandon触发Session.OnEnd事件
如果你是关浏览器、甚至是关电源,等到timeout时也会触发Session.OnEnd事件
Top
16 楼eastliangliang(青苹果:拒绝羊皮的狼)回复于 2001-07-26 10:59:34 得分 0
问题解决,感谢大家参与,结帐!Top




