Filter过滤器+Cookie机制实现网站访问量统计

配置过滤器:
 
 <!-- 定义自己的过滤器 -->
     <filter>
         <filter-name>MyFilter</filter-name>
         <filter-class>com.lyq.CountTimes</filter-class>
       <--  初始化过滤器参数 -->
         <init-param>
             <param-name>auther</param-name>
             <param-value>Coffee_Guy</param-value>
         </init-param>
     </filter>
  <--过滤器映射   -->
     <filter-mapping>
        <filter-name>MyFilter</filter-name>     
              <--  默认拦截说有的页面 -->
         <url-pattern>/*</url-pattern
     </filter-mapping>
 
CountTimes类定义:
 
package com.lyq;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CountTimes implements Filter {
    
    // 过滤器传来的初始化值
    private String auther ;
    @Override
    public void destroy() {
        
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request ;
        HttpServletResponse resp = (HttpServletResponse)response ;
        //   Cookie实现计数
        boolean flag = false ;
        
        Cookie [] coks = req.getCookies();
        Cookie item = null ;
        if(coks == null)
        {
            flag =false ;
        } 
        else
       {
           for(int k=0;k<coks.length ;k++)
           {
               if(coks[k].getName().equals("time"))
               {
                flag = true ;
                item = coks[k];
                break ;
               }
           }
        
        }
        if(!flag)
        {
            long time = 1;
            Cookie count = new Cookie("time",time+"");
            resp.addCookie(count);  // 更新客户端的Cookie值
            
        }else {
 //      取出Cookie中的次数加上一  ,然后把cookie重新发给客户端更新
            long time = Integer.valueOf(item.getValue()) + 1 ;
            
            Cookie cook = new Cookie("time",time+"");
            
            resp.addCookie(cook);  // 更新客户端的Cookie值
              }
            resp.addCookie(new Cookie("auther",auther));
//       将请求与响应衔接起来。完成用户的一次访问
            chain.doFilter(req, resp);
         }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //取得初始化值    
        auther = filterConfig.getInitParameter("auther");
    }
}


index.jsp页面:

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>主页</title>
    <!--
<link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <%
  Cookie cookies[] = request.getCookies();
  long count = 4;
  String auther = "xxoo";


  if(cookies != null)
  {
  for(int k=0;k<cookies.length ;k++)
  {
  if(cookies[k].getName().equals("time"))
  {
  count = Integer.valueOf(cookies[k].getValue());
  }
  if(cookies[k].getName().equals("auther"))
  {
  auther = cookies[k].getValue();
  }
  }
  }
  %>
  <body>
    <div align="center">
    <h1>作者:<%=auther %></h1>
    <h1>《Cookie实现 》已被访问<%=count %>次!</h1>
    </div>
  </body>
</html>

 问题:
还有点没有想明白的,就是第一次访问:显示是index.jsp页面的初始化值:xxoo   4 次   。。。
我过滤器里处理,已经将第一次访问处理了啊。。也就是第一次访问时 会在过滤器里创建好Cookie 传给index.jsp页面了,按理说就不应该出现 第一次访问:index.jsp 中Cookies为null ,显示  xxoo  4次 的现象啊???目前还是想不明白呢。。。
希望读者能帮忙解答下疑惑,共同学习学习。。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值