bbs 在线用户统计问题!!!!
做一bbs 在线登录用户和临时来访用户统计(要求用户登录或退出后删除用户记录),原来想用db来保存但后来想了想这种实现在性能上给服务器带来大量并发用户访问数据库的负担,所以觉得用session来保存用户比较好,但session是保存的单个用户但如果实现查询在线用户列表的功能,怎么实现啊
[解决办法]
application里面放个计数器就可以了,登陆一个+1,出去一个-1
[解决办法]
在ServletContext中存储一个List,当用户登录后就把这个用户的相关的扼要信息型一个bean添加到这个List中去。
统计的时候就统计这个List就可以了。
当用户退出就从这个List中删除代表这个用户的那个Bean对象。
[解决办法]
感觉这个事情得用session + db结合起来控制。
session 和 db的表纪录 一一对应
访问的时候 --〉insert
服务器Listener监听到session 销毁事件的时候 --〉delete
这样你在任何时候对在线人数,在线具体的用户信息都很了解。
--------------------------------------------
国内第一款“无端网游”,不用下客户端点击链接立即开始玩网游。http://pet.mop.com/?u=8094002来了找精灵之森(网通)的小麦兜儿,就是我!用Mop的ID就能玩的
--------------------------------------------
[解决办法]
将所有登陆用户放到集合中,用户登陆成功就添加到用户列表,用户退出就从用户列表中移出。
注意User类所实现的接口以及其中以下两个方法:
//对象被绑定到session中时通知该对象
public void valueBound(HttpSessionBindingEvent event)
{
ul.addUser(name);
}
//从session中删除对象时通知该对象
public void valueUnbound(HttpSessionBindingEvent event)
{
ul.removeUser(name);
}
-----------------------------------
*********** login.html *************
<html>
<head>
<title> 登录页面 </title>
</head>
<body>
<form action= "online " method= "post ">
<table>
<tr>
<td> 请输入用户名: </td>
<td> <input type= "text " name= "user "> </td>
</tr>
<tr>
<td> 请输入密码: </td>
<td> <input type= "password " name= "password "> </td>
</tr>
<tr>
<td> <input type= "reset " value= "重填 "> </td>
<td> <input type= "submit " value= "登录 "> </td>
</tr>
</table>
</form>
</body>
</html>
*********** OnlineUser.java ************
package org.sunxin.lesson.jsp.ch09.online;
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
import java.util.Enumeration;
public class OnlineUser extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException,IOException
{
req.setCharacterEncoding( "gb2312 ");
String name=req.getParameter( "user ");
String pwd=req.getParameter( "password ");
if(null==name || null==pwd || name.equals( " ") || pwd.equals( " "))
{
resp.sendRedirect( "login.html ");
}
else
{
HttpSession session=req.getSession();
User user=(User)session.getAttribute( "user ");
if(null==user || !name.equals(user.getName()))
{
user=new User(name);
session.setAttribute( "user ",user);
}
resp.setContentType( "text/html;charset=gb2312 ");
PrintWriter out=resp.getWriter();
out.println( "欢迎用户 <b> "+name+ " </b> 登录 ");
UserList ul=UserList.getInstance();
out.println( " <br/> 当前在线的用户列表: <br/> ");
Enumeration <String> enums=ul.getUserList();
int i=0;
while(enums.hasMoreElements())
{
out.println(enums.nextElement());
out.println( " ");
if(++i==10)
{
out.println( " <br/> ");
}
}
out.println( " <br/> 当前在线的用户数: "+i);
out.println( " <p> <a href=logout> 退出登录 </a> ");
out.close();
}
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException,IOException
{
doGet(req,resp);
}
}
*********** LogoutServlet.java ************
package org.sunxin.lesson.jsp.ch09.online;
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
public class LogoutServlet extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException,IOException
{
resp.setContentType( "text/html;charset=gb2312 ");
HttpSession session=req.getSession();
User user=(User)session.getAttribute( "user ");
session.invalidate();
PrintWriter out=resp.getWriter();
out.println( " <html> <head> <title> 退出登录 </title> </head> <body> ");
out.println(user.getName()+ ",你已退出登录 <br/> ");
out.println( " <a href=login.html> 重新登录 </a> ");
out.println( " </body> </html> ");
out.close();
}
}
[解决办法]
coffee 我用×关浏览器怎么办
死机重启怎么办
[解决办法]
用application做个计数器
[解决办法]
记在一个.properties属性文件中.每登录一个就加一个在属性文件中,登出就减一个.