分析:

统计工作需要在所有资源之前都执行,那么就可以放到Filter中。

我们这个过滤器不打算做拦截操作!因为我们只是用来做统计

用什么东西来装载统计的数据。Map<String,Integer>

整个网站只需要一个Map即可!

Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中),Map保存到哪里!(Map保存到ServletContext中)

>Map需要在Filter中用来保存数据

>Map需要在页面使用,打印Map中的数据

代码准备:

一个Listener: public void contextInitialized(ServletContextEvent sce)  { }

一个Filter:

  >public void init(FilterConfig fConfig) throws ServletException {}

  >public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {}

一个show.jsp

一个web.xml

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

代码实现:

---Listener类实现

import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class AListener implements ServletContextListener {

  /**
  * 在服务器启动时创建Map,保存到ServletContext
  */
  public void contextInitialized(ServletContextEvent sce) {
    //创建Map
    Map<String,Integer> map=new LinkedHashMap<String,Integer>();
    //得到ServletContext
    ServletContext application=sce.getServletContext();
    //把map保存到application中
    application.setAttribute("map", map);
  }
  public void contextDestroyed(ServletContextEvent sce) { }
}

---Filter类实现

import java.io.IOException;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
* 从application中获取Map
* 从request中得到当前客户端的IP
* 进行统计工作,结果保存到map中
*/
public class AFilter implements Filter {

  private FilterConfig config;

  public void init(FilterConfig fConfig) throws ServletException {
    this.config=fConfig;
  }
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    /*
    * 1.得到application中的map
    * 2.从request中获取当前客户端的IP地址
    * 3.查看map中是否存在这个IP对应访问次数,如果存在,把次数+1再保存回去
    * 4.如果不存在这个IP,那么说明是第一次访问本站,设置访问次数为1.
    */
    //得到application
    ServletContext app=config.getServletContext();
    Map<String,Integer> map=(Map<String, Integer>) app.getAttribute("map");

    //获取客户端IP地址
    String ip=request.getRemoteAddr();

    //进行判断
    if(map.containsKey(ip)){//这个IP在map中存在,说明不是第一次访问
      int cnt=map.get(ip);
      map.put(ip, cnt+1);
    }else{//这个IP在map中不存在,说明是第一次访问。
    map.put(ip, 1);
    }
    app.setAttribute("map", map);//把map放回APP中
    chain.doFilter(request, response);
  }
  public void destroy() { }

}

-----web.xml配置

<listener>
<display-name>AListener</display-name>
<listener-class>cn.itcast.web.listener.AListener</listener-class>
</listener>

<filter>
<filter-name>AFilter</filter-name>
<filter-class>cn.itcast.web.filter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

-----show,jsp

<h1 align="center">显示结果</h1>
<table align="center" border="1" width="60%">
<tr>
<td>IP</td>
<td>次数</td>
</tr>
<c:forEach items="${applicationScope.map }" var="entry">
<tr>
<td>${entry.key }</td>
<td>${entry.value }</td>
</tr>
</c:forEach>
</table>

------

在做这个功能的时候出现的异常:

1、在Listener类中,方法一定要用contextInitialized(ServletContextEvent sce),要不会抛空指针异常。

使用javaWeb的二大(Listener、Filter)组件实现分IP统计访问次数的更多相关文章

  1. filter应用案例一:分IP统计访问次数

    统计工作需要在所有资源之前都执行,那么就可以放到Filter中了.用Map<String,Integer>装载统计的数据.Map创建时间(使用ServletContextListener, ...

  2. Filter和Listener的应用——分IP统计网站访问次数

    一:分析 统计工作需要在所有资源执行前进行,所以需要放在filter中 这个拦截器仅仅进行统计工作,不进行拦截,所以请求必须继续传递下去 用Map<String,integer>来保存数据 ...

  3. javaweb(4)之Listener&Filter

    监听器 (Listener) 介绍 监听器用于监听 web 应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器 ...

  4. Java web 实现 之 Filter分析ip统计网站的访问次数

    统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的. 用什么东西来装载统计的数据.Map<String,Integer& ...

  5. JavaWeb 三大器--Listener、Filter 和Interceptor 总结

    说明:web.xml的加载顺序是:[Context-Param]->[Listener]->[Filter]->[Servlet],而同个类型之间的实际程序调用的时候的顺序是根据对应 ...

  6. javaWeb学习之Listener监听

    ] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet  listener  filt ...

  7. servlet,listener,filter,interceptor的关系

    1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.最早支持 Servlet 技术 ...

  8. web.xml中的主要元素说明(listener, filter, servlet)

    web.xml中加载的顺序为:context-param ---> listener ---> filter ---> servlet. listener:主要针对的是对象的操作,如 ...

  9. web.xml之context-param,listener,filter,servlet加载顺序及其周边

    先以加载spring为例子看看加载顺序的作用: Spring加载可以利用ServletContextListener 实现,也可以采用load-on-startup Servlet 实现,但比如fil ...

随机推荐

  1. 深度学习框架PyTorch一书的学习-第一/二章

    参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 pytorch的设计遵循tensor- ...

  2. 解决Nginx+Tomcat下客户端https请求跳转成http的问题

    Nginx上开启https,  后端使用Tomcat,  两者间走http协议, 但发现如果tomcat应用存在跳转时, 则客户端浏览器会出现400 Bad Request的错误, 通过抓包发现原因是 ...

  3. JDK动态代理(1)-----------new 对象的方式

    //case 1: 直接newHelloWorldImpl helloWorldImpl = new HelloWorldImpl(); //case 2: 反射拿到类之后,通过newInstance ...

  4. class文件魔数CAFEBABE的由来

    https://blog.csdn.net/ustcyy91/article/details/78462378 https://blog.csdn.net/renfufei/article/detai ...

  5. 2018-2019-2 20175310实验一《Java开发环境的熟悉》实验报告

    2018-2019-2 20175310实验一<Java开发环境的熟悉>实验报告 一.实验步骤及内容 (一).Java开发环境的熟悉-1 1.建立20175310exp1的目录 2.在20 ...

  6. ModelViewSet 路由 / django logging配置 / django-debug-toolbar使用

    一.ModelViewSet 路由 因为我们正在使用ViewSet代替View,实际上已经不再需要自己来设计URL的配置了.将资源和视图.URL绑定到一起是一个可以自动完成的过程,只需要使用Route ...

  7. [MicroPython]TPYBoard v102炫彩跑马灯WS2812B

    一.实验目的 了解ws2812b的工作原理 学习ws2812b的驱动方法 二.实验器材 TPYBoard v102 1块 ws2812b RGB-Ring-8 1个 micro USB数据线 1条 杜 ...

  8. Unity编辑器:基于NGUI的引用检测工具

    这里共享一个基于NGUI的引用检测工具.工具包括几个部分:Atlas/Sprite的引用查找:字库引用查找:UITexture引用查找:Component查找: 代码就不多介绍了,文章底部提供源码下载 ...

  9. Jmeter+ant+jenkins集成

    已有jmeter.*.jmx脚本 一.jmeter+ant 1.下载安装ant(检查是否安装成功) 2.将 JMeter 所在目录下 extras 子目录里的 ant-JMeter-1.1.1.jar ...

  10. sklearn 数据预处理1: StandardScaler

    作用:去均值和方差归一化.且是针对每一个特征维度来做的,而不是针对样本. [注:] 并不是所有的标准化都能给estimator带来好处. “Standardization of a dataset i ...