网站流量统计,java+jsp 获取访客浏览器,真实ip,操作系统,来源

原创 2015年07月10日 19:43:56

公司最近在做官网,需要做流量统计,发现网上关于这一块的东西比较杂乱。整理了一下,以后备用

--------------------------------------------------------------------------------------------------------------------------------

采用servlet的filter获取request对象,以获取访客信息

public class StatFilter
    implements Filter {
    public StatFilter() {
    }

    public void init(FilterConfig filtercfg) throws javax.servlet.
        ServletException {
    }

    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain filterchain) throws java.io.IOException,
        javax.servlet.ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
       
        HttpSession session = httpRequest.getSession(true);
       
        if (session.getAttribute("isRecorded") == null) {
            //如果本次用户访问还没有记录,就记录本次用户信息,并保存到数据库中
            session.setAttribute("isRecorded", Boolean.TRUE);
            //在session对象中保存一个变量"isRecorded",并赋值
            String ip = getIp(httpRequest);//用户ip
            String browser = getBrowser(httpRequest);//用户使用的浏览器
            String os = getSysInfo(httpRequest);//用户使用系统
            String source = httpRequest.getHeader("Referer");//访问来源
            String url = httpRequest.getRequestURI();//用户当前访问路径
    
            if (browser == null) {
                browser = "未知";
                //如果读取的浏览器名为空,则赋值为“未知”
            }
            if (os == null) {
                os = "未知";
                //如果读取的操作系统名为空,则赋值为“未知”
            }
            try {
                System.out.println("ip:"+ip);
                System.out.println("os:"+os.trim());
                System.out.println("browser:"+browser.trim());
                System.out.println("source:"+source);
                System.out.println("url:"+url);
            //    StatHandle.insert(ip, os.trim(), browser.trim());
                //调用业务逻辑,将用户数据插入到数据库中
            }
            catch (Exception es) {
                es.printStackTrace();
                //在输入日志中打印异常信息
            }
        }
        filterchain.doFilter(request, response);
        //调用下一个过滤器或者直接调用JSP
    }

//  Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.7.12) Gecko/20050919 Firefox/1.0.7
//  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
    public void destroy() {
    }
    
    public String getIp(HttpServletRequest httpRequest){
         String ipAddress = httpRequest.getHeader("x-forwarded-for");  
         if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
                         ipAddress = httpRequest.getHeader("Proxy-Client-IP");  
                    }  
                    if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
                         ipAddress = httpRequest.getHeader("WL-Proxy-Client-IP");  
                   }  
                    if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
                         ipAddress = httpRequest.getRemoteAddr();  
                         if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){  
                           //根据网卡取本机配置的IP  
                             InetAddress inet=null;  
                             try {  
                                 inet = InetAddress.getLocalHost();  
                             } catch (UnknownHostException e) {  
                            e.printStackTrace();  
                           }  
                            ipAddress= inet.getHostAddress();  
                         }  
                     }  
                    //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割  
                   if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15  
                         if(ipAddress.indexOf(",")>0){  
                             ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));  
                         }  
                     }  

                   return ipAddress;
    }
    public String getBrowser(HttpServletRequest httpRequest){
          String agent = httpRequest.getHeader("User-Agent");
          String browserVersion = "";
          //从请求头中读取User-Agent值
          if(agent.indexOf("MSIE")>0){
              browserVersion = "IE";
          }else if(agent.indexOf("Firefox")>0){
              browserVersion = "Firefox";
          }else if(agent.indexOf("Chrome")>0){
              browserVersion = "Chrome";
          }else if(agent.indexOf("Safari")>0){
              browserVersion = "Safari";
          }else if(agent.indexOf("Camino")>0){
              browserVersion = "Camino";
          }else if(agent.indexOf("Konqueror")>0){
              browserVersion = "Konqueror";
          }else if(agent.indexOf("QQBrowser")>0){
              browserVersion = "QQBrowser";
          }
          if("".equals(browserVersion)){
              StringTokenizer st = new StringTokenizer(agent, "(;)");
              while(st.hasMoreElements()){  
                  browserVersion=st.nextToken();
                  }  
          }
    
        return browserVersion;
    }
    public String getSysInfo(HttpServletRequest httpRequest){
        String systenInfo="";
        String agent = httpRequest.getHeader("User-Agent");
        if (agent.indexOf("NT 10.0") > 0){
            systenInfo = "Windows Vista/Server 10";
        }else if (agent.indexOf("NT 8.0") > 0){
            systenInfo = "Windows Vista/Server 8";
        }else if (agent.indexOf("NT 6.0") > 0){
            systenInfo = "Windows Vista/Server 2008";
        } else if (agent.indexOf("NT 5.2") > 0){
            systenInfo = "Windows Server 2003";
        } else if (agent.indexOf("NT 5.1") > 0){
            systenInfo = "Windows XP";
        } else if (agent.indexOf("NT 6.0") > 0){
            systenInfo = "Windows Vista";
        } else if (agent.indexOf("NT 6.1") > 0){
            systenInfo = "Windows 7";
        } else if (agent.indexOf("NT 6.2") > 0){
            systenInfo = "Windows Slate";
        } else if (agent.indexOf("NT 6.3") > 0){
            systenInfo = "Windows 8";
        } else if (agent.indexOf("NT 5") > 0){
            systenInfo = "Windows 2000";
        } else if (agent.indexOf("NT 4") > 0){
            systenInfo = "Windows NT4";
        } else if (agent.indexOf("Me") > 0){
            systenInfo = "Windows Me";
        } else if (agent.indexOf("98") > 0){
            systenInfo = "Windows 98";
        } else if (agent.indexOf("95") > 0){
            systenInfo = "Windows 95";
        } else if (agent.indexOf("Mac") > 0){
            systenInfo = "Mac";
        } else if (agent.indexOf("Unix") > 0){
            systenInfo = "UNIX";
        } else if (agent.indexOf("Linux") > 0){
            systenInfo = "Linux";
        } else if (agent.indexOf("SunOS") > 0){
            systenInfo = "SunOS";
        }
        if("".equals(systenInfo)){
             StringTokenizer st = new StringTokenizer(agent, "(;)");
             int i=0;
             while(st.hasMoreElements()&&i<=1){
                 i++;
                 systenInfo=st.nextToken();
                 }  
        }
        return systenInfo;
    }

}



今天在实现的过程中,找出来一点问题,继续贴在末尾吧。上面是将代码写在了filter里,有一点不合适,因为在filter中的代码,只有在创建servlet容器的时候才会执行一次filter,此后则不再执行,我们要记录多个页面的访问情况,最好将代码嵌在jsp页面的初始化。这样则不受影响了


相关文章推荐

IP数据包的流量统计(JAVA语言)

如果不显示图片,或者出现排版错误,抽风,崩坏,节操丢失等一系列不正常情况,请点击下面链接观看,点我 IP数据包的流量统计(JAVA语言) 要求:编制程序,监控网络,捕获一段时间内网络上...

Java 局域网流量统计

这里主要介绍以下JPCAP Jpcap是2003年日本开发的一套能够捕获、发送网络数据包的java类库。因为核心Java API不能访问底层的网络数据,但Jpcap是一种提供在Windows或UNI...

java实现页面访问量统计的实例

有时候,我们可能需要统计Web站点上的一个特定页面的访问次数,考虑这样一个场景,你为了宣传一个产品,在某个门户网站花钱做了一个链接,你希望知道产品页面每天的访问量,借此了解广告的效果。要完成上述功能,...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

java jsp实现网站访问量的统计

最近做网站的开发,需要做网站的访问量统计,以前也做过这方面的东西,不过以前做的时候是在asp下做的,而且只能实现简单的网站历史总访问量的统计,且访问的数据是放在文件一个文件中的,现在在jsp下实现,个...
  • hj7jay
  • hj7jay
  • 2016年04月23日 14:45
  • 6081

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

Radon变换理论介绍与matlab实现--经验交流

本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...

CT图像重建技术

由于csdn贴图不方便,并且不能上传附件,我把原文上传到了资源空间CT图像重建技术 1.引言 计算机层析成像(Computed Tomography,CT)是通过对物体进行不同角度的射线投影测量而...

Matlab绘图-很详细,很全面

Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Ma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网站流量统计,java+jsp 获取访客浏览器,真实ip,操作系统,来源
举报原因:
原因补充:

(最多只允许输入30个字)