现在的位置: 首页 > 综合 > 正文

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

2014年07月15日 ⁄ 综合 ⁄ 共 3222字 ⁄ 字号 评论关闭

注册免费网站计数器

<!-- start http://count.knowsky.com -->
<script src=http://count.knowsky.com/count1/count.asp?id=61435&sx=1&ys=43></script>
<!-- Powered by http://www.knowsky.com -->

自己写程序:

http://aiesechugo.spaces.live.com/Blog/cns!60E32E617081B7AA!4613.entry 原文

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

如有问题,请与我联系,最好是在评论中留言

抱歉!评论已关闭.