一个网页计数器,用来实现统计网站访问人数功能,doFilter方法体是这样的public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 
    throws IOException,ServletException{
    count++;     //count在初始化方法中被赋值,表示请求之前的访问量
    HttpServletRequest req = (HttpServletRequest)request;
    ServletContext context = req.getsession().getServletContext();
    context.setAttribute("count",count);
    chain.doFilter(request,response);
}理论是客户端请求一次资源过滤一次,服务器将资源给客户端又过滤一次,为什么count不是加了2次呢?

解决方案 »

  1.   

    这个count在两次访问的时候都会累积?? 不是分别++么?
      

  2.   

    理论上是这样,
    实践时,只有你在chain.doFilter(request,response);语句之后自己做一条count++;
    才能将响应返回时的过滤机会利用上。
      

  3.   

    意思是chain.doFilter语句之前不管什么代码都是只执行一遍的吗?
      

  4.   

    过滤器原理:
        写在chain.doFilter(request,response);之前的代码 会在请求过程中执行
        当请求完成以后 返回响应  不会再执行chain.doFilter(request,response);之前的代码
        而是只执行chain.doFilter(request,response);之后的代码。
    所以 在一次请求+访问的过程中,过滤器内的代码只会执行一次,区别在于
        chain.doFilter(request,response);前后的代码  分别在请求 和 响应两个阶段执行
    chain.doFilter(request,response);这句原理是与方法调用的原理一样的。
    执行到chain.doFilter(request,response);时,调用下一个过滤器,若没有过滤器,则进入Servlet
    Servlet执行完毕,返回到最后一个过滤器,然后依次返回到第一个过滤器。当第一个过滤器执行完毕,会返回到客户端。  这么说 你明白了吗?