如何统计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>的相关配置之前