一:分析

统计工作需要在所有资源执行前进行,所以需要放在filter中

这个拦截器仅仅进行统计工作,不进行拦截,所以请求必须继续传递下去

用Map<String,integer>来保存数据,一个IP一个键值对,故整个网站只需要一个Map即可

使用ServletContextListener,在服务器启动时完成创建工作

将Map保存到servletContext中

Map需要在Filter中对数据进行累加操作

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

二:代码

  1)jsp

    

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'show.jsp' starting page</title>
</head> <body>
<h1 align="center">显示结果</h1>
<table align="center" width="60%" border="1">
<tr>
<th>IP</th>
<th>次数</th>
</tr>
<c:forEach items="${applicationScope.map }" var="entry">
<tr>
<td>${entry.key }</td>
<td>${entry.value }</td>
</tr>
</c:forEach>
</table>
</body>
</html>

  2)Listener

package listener; /**
* Created by YuWenHui on 2017/4/9 0009.
*/ import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.LinkedHashMap;
import java.util.Map; public class IPCountListener implements ServletContextListener{ public IPCountListener() {
}
public void contextInitialized(ServletContextEvent sce) {
// 创建map
Map<String,Integer> map = new LinkedHashMap<String ,Integer>();
ServletContext application= sce.getServletContext();
application.setAttribute("map",map);
} public void contextDestroyed(ServletContextEvent sce) {
}
}

  3)Filter

package filter;

import javax.servlet.*;
import java.io.IOException;
import java.util.Map; /**
* Created by YuWenHui on 2017/4/9 0009.
*/
public class IPCountFilter implements Filter {
private FilterConfig config=null;
public void destroy() {
} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// 获取map,从FilterConfig中可以直接获取到,故先将FilterConfig对象私有化,再进行赋值(在init中)
ServletContext application = config.getServletContext();
Map<String,Integer> map = (Map<String, Integer>) application.getAttribute("map" );
// 获取ip地址
String ip = req.getRemoteAddr();
// 判断IP是否存在
if (map.containsKey(ip)){ //判断IP是否在map中
int num = map.get(ip);
map.put(ip,num+1);
}else {
map.put(ip,1);
}
// 保存map
application.setAttribute("map",map);
chain.doFilter(req, resp);
} public void init(FilterConfig config) throws ServletException {
this.config=config;
} }

  4)web.xml

 

<filter>
<filter-name>IPCountFilter</filter-name>
<filter-class>filter.IPCountFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>IPCountFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置监听器-->
<listener>
<listener-class>listener.IPCountListener</listener-class>
</listener>

Filter和Listener的应用——分IP统计网站访问次数的更多相关文章

  1. 分ip统计网站访问次数

    package web.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; ...

  2. 学习笔记_过滤器应用_1(分ip统计网站的访问次数)

    分ip统计网站的访问次数 ip count 192.168.1.111 2 192.168.1.112 59 统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做 ...

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

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

  4. php统计网站访问次数的一个简单方法

    这里主要用到了session保存当前访问者,并将访问次数写入本地文件. <? @session_start(); $counter = intval(file_get_contents(&quo ...

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

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

  6. Java web--Filter过滤器分IP统计访问次数

    分IP统计访问次数即网站统计每个IP地址访问本网站的次数. 分析 因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便. 因为需要分IP统计,所以可以在过滤器中创建 ...

  7. JSP简单实现统计网页访问次数

    JSP简单实现统计网页访问次数 需求:统计网页的访问次数 核心思想:利用application对象,将访问次数的信息放入application对象中,每次访问就+1.这里利用了application对 ...

  8. 【JAVA系列】使用JavaScript实现网站访问次数统计代码

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[JAVA系列]使用JavaScript实现网站 ...

  9. 使用javaWeb的二大(Listener、Filter)组件实现分IP统计访问次数

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

随机推荐

  1. java 限定控制台输入值的类型

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...

  2. mybatis基础,mybatis配置文件核心组件typeHandler元素

    无论是从预处理语句中设置一个值,还是从结果集里取出一个值,都会用类型处理器将获取的值以合适的方式转换成 Java 类型 可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型 实现 o ...

  3. virtualBox,webstorm,开虚拟机传代码

    一起git一个新技能 利用virtualBOX在本地开一个虚拟机,然后设置webstorm连接到虚拟机,将代码传到虚拟机里. 以下详细讲解: 第一步: 第二步:管理虚拟机的设置(我是用的是Xshell ...

  4. HttpServletResponse对象介绍

    一.HttpServletResponse对象介绍

  5. HTML5初步了解

        一.使用HTML5的十大原因 你难道还没有考虑使用HTML5? 当然我猜想你可能有自己的原因:它现在还没有被广泛的支持,在IE中不好使,或者你就是喜欢写比较严格的XHTML代码.HTML5是w ...

  6. Jmeter正则提取list中相同key的value和出现的次数

    list中如何计算某个key出现的次数以及通过正则关联参数化呢? 首先要通过正则提取出现key的value 举例:

  7. AOP执行增强-Spring 源码系列(5)

    AOP增强实现-Spring 源码系列(5) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostProc ...

  8. HttpURLConnection实现两个服务端的对接

    在企业开发中,很多时候需要用到两个服务端的对接,在java类中进行连接并传递参数,其中的HttpURLConnection是一种轻量化,并且简单的方法! package httptest; impor ...

  9. 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  10. Linux-ubuntu安装过程讲解

    前言也不准备介绍Linux是什么,为什么要安装ubuntu?相信你能够看到这篇文章也知道自己想要做什么. 一,准备工具 1.VMwareWorkstation虚拟机 下载地址:https://my.v ...