统计java网站访问量和在线人数

简言之,如果不用第三方提供的接口
  那最好的解决方案应该是当SESSION建立时sessionCreated(),在访问总数和当前在线人数上+1
  当SESSION销毁时sessionDistroyed(),在线人数-1
  核心方法是利用Listener监听的各种接口
  我把代码(主要部分)贴在下面
  此段代码我亲自使用过,没有问题
  但因为继承了接口,有些未使用的方法也要补充进去,具体方式比如在MyEclipse中可以靠点错误,ADD UNIMPLEMENTED METHOD实现
  package com.eaie.system;
  import java.io.FileOutputStream;
  import java.io.InputStream;
  import java.io.PrintWriter;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.util.Enumeration;
  import java.util.Set;
  import javax.servlet.RequestDispatcher;
  import javax.servlet.Servlet;
  import javax.servlet.ServletContext;
  import javax.servlet.ServletContextEvent;
  import javax.servlet.ServletException;
  import javax.servlet.ServletRequestEvent;
  import javax.servlet.ServletRequestListener;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpSessionActivationListener;
  import javax.servlet.http.HttpSessionEvent;
  import javax.servlet.http.HttpSessionListener;
  public class SessionListener implements HttpSessionActivationListener,
  HttpSessionListener, ServletContext, ServletRequestListener {
  ServletContext context;
  int onLineUserNum = 0;
  int visitNum = 0;
  HttpServletRequest request;
  public void sessionDidActivate(HttpSessionEvent session) {
  log("seesionDidActive("+session.getSession().getId()+")");
  }
  public void sessionWillPassivate(HttpSessionEvent session) {
  log("seesionWillPassivate("+session.getSession().getId()+")");
  }
  public void sessionCreated(HttpSessionEvent event) {
  onLineUserNum++;
  visitNum ++;
  String ip = request.getRemoteAddr();
  log("sessionCreated('"+event.getSession().getId()+"'),-->IP:"+ip);
  context.setAttribute("onLineUserNum", new Integer(onLineUserNum));
  context.setAttribute("visitNum", new Integer(visitNum));
  }
  public void sessionDestroyed(HttpSessionEvent event) {
  if (onLineUserNum>0){
  onLineUserNum--;
  }
  String ip = request.getRemoteAddr();
  log("sessionDestroyed('"+event.getSession().getId()+"'),-->IP:"+ip);
  context.setAttribute("onLineUserNum", new Integer(onLineUserNum));
  }
  public void contextDestroyed(ServletContextEvent sce){
  log("contextDestroyed-->ServletContext is destroyed");
  this.context = null;
  }
  public void contextInitialized(ServletContextEvent sce){
  this.context = sce.getServletContext();
  log("contextDestroyed-->ServletContext is initialized");
  }
  public int getUserOnline(){
  return this.onLineUserNum;
  }
  public void log(String message) {
  PrintWriter out = null;
  try{
  out = new PrintWriter(new FileOutputStream("c:\\eaieLogger.txt",true));
  out.println(new java.util.Date().toLocaleString()+"::From SessionListener:"+message);
  out.println("Totle visit number:"+this.visitNum+" and current online num: "+onLineUserNum);
  out.println("=================================");
  out.close();
  }catch(Exception e){
  e.printStackTrace();
  out.close();
  }
  }
  public void requestInitialized(ServletRequestEvent event) {
  request = (HttpServletRequest)event.getServletRequest();
  }
  //省略其他方法
  }
  这个程序需要在web.xml中配置:
  <listener>
  <listener-class>com.eaie.system.SessionListener</listener-class>
  </listener>
  需要注意的是LISTENR的位置,必须在<FILTER>的相关配置之后,在<SERVLET>的相关配置之前
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值