[讨论]在线用户情况的统计!谢谢!

flybird079 2003-08-01 11:34:14
最近在做一个项目时遇到这样一个需求,需要统计通过身份验证的用户在线情况,目的是为了实现防止重复登录和对服务器负载情况的跟踪。觉得没有什么好的解决办法,如果在数据库中加入在线用户表,那在线用户的添加是没有什么问题,但是用户退出时(非正常退出,如关闭浏览器,死机重启)怎么处理表呢?
请问有谁做过这样的东东或者有什么好的想法,请指教。和大家交流一下,至于分可以再加,谢谢!
(JSP平台上)
...全文
34 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
flybird079 2003-10-16
  • 打赏
  • 举报
回复
现在问题是初步解决了,使用 HttpSessionBindingListener 实现,但是如果用户是关闭浏览器的话还是要等session失效时间到了才能监听到。这样造成一个结果是在最坏情况下如果session失效时间设为40分钟,服务器已达到最高负载并且所有用户处在同一个配电区域,此时如果断电了,服务器只能等session失效也就是最多40分钟后才能将负载清空,也就是说所有的用户将有靠近40分钟无法使用服务器的资源。这种情况也比较难处理啊
ychunshui 2003-09-17
  • 打赏
  • 举报
回复
acl是什么来的?
shipp 2003-09-16
  • 打赏
  • 举报
回复
用ACL
leshui 2003-09-16
  • 打赏
  • 举报
回复
但是很灵活:)
可以自己设掉线的时间什么的
dmhorse 2003-09-16
  • 打赏
  • 举报
回复
这样做的话比不上用 HttpSessionBindingListener 这种方法直接
leshui 2003-09-16
  • 打赏
  • 举报
回复
4。还要把刷新的页面包含到所有的页面,我这里是在一个公用的top里,可以设成ifram
leshui 2003-09-16
  • 打赏
  • 举报
回复
我这里是这么做的:
1。在用户表里设一个是否在线和最后动作时间
2。做一个不断刷新的页面,刷新间隔可以自己设,把当前用户的最后动作时间更新为当前时间
3。统计在线用户的时候取出当前时间和最后动作时间的间隔,如果小于一个间隔就认为是在线
Rayy 2003-09-16
  • 打赏
  • 举报
回复
期待更好的解决方法,思路!!
squallzeng 2003-09-15
  • 打赏
  • 举报
回复
关注有好思路给一份!!!!
mail:squallzeng@hotmail.com
dmhorse 2003-09-15
  • 打赏
  • 举报
回复
Agree implement HttpSessionBindingListener

The best way.

ychunshui 2003-09-15
  • 打赏
  • 举报
回复
session.setMaxInactiveInterval(50); // Session有效时长,以秒为单位

如果不设session有效时间,请问如何在关闭浏览器时使session无效
wyhgg 2003-09-13
  • 打赏
  • 举报
回复
我做过,不很理想,
如果楼上有好办法。
给我一点思路。
wyhgg@sina.com.cn
dogcai 2003-09-13
  • 打赏
  • 举报
回复
谢谢楼上的,学到了很多。
Yssss1980 2003-09-13
  • 打赏
  • 举报
回复
上次看到的一个解答,找不到源贴

/**这是管理user信息的类

文件名为onLineUser.java

*/

import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;

public class onLineUser implements HttpSessionBindingListener {
public onLineUser(){
}

private Vector users=new Vector();
public int getCount(){
users.trimToSize();
return users.capacity();
}
public boolean existUser(String userName){
users.trimToSize();
boolean existUser=false;
for (int i=0;i<users.capacity();i++ )
{
if (userName.equals((String)users.get(i)))
{
existUser=true;
break;
}
}
return existUser;
}

public boolean deleteUser(String userName) {
users.trimToSize();
if(existUser(userName)){
int currUserIndex=-1;
for(int i=0;i<users.capacity();i++){
if(userName.equals((String)users.get(i))){
currUserIndex=i;
break;
}
}
if (currUserIndex!=-1){
users.remove(currUserIndex);
users.trimToSize();
return true;
}
}
return false;
}

public Vector getOnLineUser()
{
return users;
}
public void valueBound(HttpSessionBindingEvent e) {
users.trimToSize();
if(!existUser(e.getName())){
users.add(e.getName());
System.out.print(e.getName()+"\t 登入到系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}else
System.out.println(e.getName()+"已经存在");
}

public void valueUnbound(HttpSessionBindingEvent e) {
users.trimToSize();
String userName=e.getName();
deleteUser(userName);
System.out.print(userName+"\t 退出系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}
}

/////////////////////////////////////////////////////////////////////////////
<%
/**这是显示在线用户的jsp文件

文件名为onLineUser.jsp

*/
%>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="onLineUser,java.util.*" %>
<jsp:useBean id="onlineuser" class="onLineUser" scope="application"/>
<html>
<head>
<title>搞定JSP在线人数</title>
</head>
<body>
<center>
<p><h1>登陆成功,欢迎您访问!</h1></p>
</center>
<% session = request.getSession(false); %>
<%
String username=request.getParameter("username");
if (onlineuser.existUser(username)){
out.println("用户<font color=red>"+username+"</font>已经登陆!");
}else{
session.setMaxInactiveInterval(50); file://Sesion有效时长,以秒为单位
session.setAttribute(username,onlineuser);
out.println("欢迎新用户:<font color=red>"+username+"</font>登陆到系统!");
}
out.println("<br>当前在线用户人数:<font color=red>"+onlineuser.getCount()+"</font><br>");
Vector vt=onlineuser.getOnLineUser();
Enumeration e = vt.elements();
out.println("在线用户列表");
out.println("<table border=1>");
out.println("<tr><td>用户名</td></tr>");
while(e.hasMoreElements()){
out.println("<tr><td>");
out.println((String)e.nextElement()+"<br>");
out.println("</td></tr>");
}
out.println("</table>");

%>
<center>
<p>elapsed制作</p>
<p> </p>
<%
out.println("<p><a href='logout.jsp?username="+username+"'>退出系统</a></p>");
%>
</center>
</body>
</html>

////////////////////////////////////////////////////////////////////////////////////
<%
/**这是用户退出的jsp文件

文件名为logout.jsp

*/
%>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="onLineUser,java.util.*" %>
<jsp:useBean id="onlineuser" class="onLineUser" scope="application"/>
<html>
<head>
<title>搞定JSP在线人数</title>
</head>
<body>
<center>
<p><h1>登陆成功,欢迎您访问!</h1></p>
</center>
<%
String username=request.getParameter("username");
if(onlineuser.deleteUser(username))
out.println(username+"已经退出系统!");
else
out.println(username+"没有登陆到系统!");
%>
<center>
<p>elapsed制作</p>
<p> </p>
<p><a href="logout.jsp">退出系统</a></p>
</center>
</body>
xqi8 2003-09-13
  • 打赏
  • 举报
回复
up
liujiboy 2003-09-13
  • 打赏
  • 举报
回复
我有一种方法是用javascript在客户端断开的时候传回退出的信息,但是无法防止死机。
另一种方法是使用activex控件,或者是java applet。还有就是使用java web start构建一个胖客户端的程序。
我也期待有更好的解决方法。
ychunshui 2003-09-13
  • 打赏
  • 举报
回复
关注

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧