如何統(tǒng)計(jì)JAVA網(wǎng)站訪問(wèn)次數(shù)并獲得訪問(wèn)者IP
作者:濟(jì)南雷鳴科技 文章來(lái)源:本站原創(chuàng) 更新時(shí)間:2023-11-07
簡(jiǎn)言之,如果不用第三方提供的接口
那最好的解決方案應(yīng)該是當(dāng)SESSION建立時(shí)sessionCreated(),在訪問(wèn)總數(shù)和當(dāng)前在線人數(shù)上+1
當(dāng)SESSION銷毀時(shí)sessionDistroyed(),在線人數(shù)-1
核心方法是利用Listener監(jiān)聽(tīng)的各種接口
我把代碼(主要部分)貼在下面
此段代碼我親自使用過(guò),沒(méi)有問(wèn)題
但因?yàn)槔^承了接口,有些未使用的方法也要補(bǔ)充進(jìn)去,具體方式比如在MyEclipse中可以靠點(diǎn)錯(cuò)誤,ADD UNIMPLEMENTED METHOD實(shí)現(xiàn)
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();
}
//省略其他方法
}
這個(gè)程序需要在web.xml中配置:
<listener>
<listener-class>com.eaie.system.SessionListener</listener-class>
</listener>
需要注意的是LISTENR的位置,必須在<FILTER>的相關(guān)配置之后,在<SERVLET>的相關(guān)配置之前