项目需要记录当前登录的在线人数,现已没有问题;而且也写了一个方法实现HttpSessionBindingListener接口,
在IE6中,当关闭IE浏览器可以使当前在线人数减一,但在IE7中,关闭浏览器,当前在线人数不变,不知是何原因,
小弟百思不得其解,恳请各位大侠能指点迷津,有何解决办法!
在IE6中,当关闭IE浏览器可以使当前在线人数减一,但在IE7中,关闭浏览器,当前在线人数不变,不知是何原因,
小弟百思不得其解,恳请各位大侠能指点迷津,有何解决办法!
解决方案 »
- 请教一个简单的关于java字符串问题?
- *********applet页面的绘图在切换窗口后消失了?*********
- JApplet无法刷新问题 急
- 关于java连接sqlserver2000的问题
- 如何在加载同一个包中的类?
- tomcat下的应用在考到weblogic 下报错
- ★☆★☆★☆★☆★☆★☆★☆★☆★☆JAVA版年度调查★☆★☆★☆★☆★☆★☆★☆★☆★☆
- java问题,请问有没有控制输出小数点后两位的函数?
- 能有高手诠释一下 SUNONE 吗?
- 我配置了JAVA_HOME之后javac可以用,java不可以用,WHY...
- 【高分在线求解】Jini启动的问题failed to load main-class manifest attribute from
- 关于从jdk1.3升级到jdk1.5,有几个疑问
public class PersonListener implements ServletContextListener,HttpSessionListener{ public void contextDestroyed(ServletContextEvent event) {
// TODO Auto-generated method stub
Properties ps=new Properties();
ServletContext app=event.getServletContext();
String path=app.getRealPath("/WEB-INF/countPerson.ini");
Integer count=(Integer)app.getAttribute("count");
System.out.println("end="+count);
ps.setProperty("count",count.toString());
PrintWriter pw=null;
try {
pw=new PrintWriter(path);
ps.list(pw);
pw.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("请求上下文结束");
} public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
Properties ps=null;
ServletContext app=event.getServletContext();
String path=app.getRealPath("/WEB-INF/countPerson.ini");
try {
InputStream in=new FileInputStream(path);
ps=new Properties();
ps.load(in);
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Integer count=Integer.parseInt(ps.getProperty("count"));
app.setAttribute("count",count );
app.setAttribute("curr",0);
System.out.println("请求上下文开始"+ps.getProperty("count"));
}
public void sessionCreated(HttpSessionEvent session) {
// TODO Auto-generated method stub
ServletContext app=session.getSession().getServletContext();
synchronized (app) {
Integer count=(Integer)app.getAttribute("count");
count++;
app.setAttribute("count",count);
System.out.println("sessionCount="+count);
Integer curr=(Integer)app.getAttribute("curr");
curr++;
app.setAttribute("curr",curr);
System.out.println("sessionCurr="+curr);
}
} public void sessionDestroyed(HttpSessionEvent session) {
// TODO Auto-generated method stub
ServletContext app=session.getSession().getServletContext();
synchronized (app) {
Integer curr=(Integer)app.getAttribute("curr");
curr--;
app.setAttribute("curr",curr);
}
}
}
还应有个“访问页面”的在线人数,这个当前人数就应放在session作用域中,当打开一个页面时就有一个唯一的session标识就会调用sessionCreated()方法这样就可以将当前人数加1;当页面关闭时将调用sessionDestroyed()方法这样就可以将当前人数减1.
我的意思大概是这样,具体情况请看代码。
public class OnlineCounter {
private static long online = 0;
public static long getOnline(){
return online;
}
public static void raise(){
online++;
}
public static void reduce(){
online--;
}
} import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineCounterListener implements HttpSessionListener{
public void sessionCreated(HttpSessionEvent hse) {
OnlineCounter.raise();
}
public void sessionDestroyed(HttpSessionEvent hse){
OnlineCounter.reduce();
}
} 这样可以么?
当然,部署在Tomcat上面,重启服务的时候,数据有可能会不准确。
使用HttpSessionBindingListener时,我记得是要向每个session对象里面setAttribute来设置。
一般情况下,只要你不动这个Attribute,它是能够监听到session的销毁事件的。楼主没有监听到销毁事件,最大的可能性是IE7关闭的时候,没有通知服务端销毁session,
这样,应该在session超时的时候,会被销毁。楼主可以尝试把session超时设短一点,比如一分钟。
在IE7上面试一下session超时,session超时后服务端应该能够监听到valueUnbound。