统计JAVA网站访问次数并获得访问者IP

    技术2022-05-20  65

    如何统计JAVA网站访问次数并获得访问者IP

      简言之,如果不用第三方提供的接口  那最好的解决方案应该是当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>的相关配置之前

     


    最新回复(0)