一:分析

统计工作需要在所有资源执行前进行,所以需要放在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>

最新文章

  1. [转]FINDSTR正则表达式小结
  2. 《HiWind企业快速开发框架实战》(2)使用HiWind创建自己的项目
  3. 关于c#调用java中间件api的几个问题
  4. geoServer 发布geoTiff格式的DEM数据
  5. Caffe学习系列(8):solver优化方法
  6. LESSCSS的几点摘要
  7. Java并发编程:Synchronized及其实现原理
  8. mysql中bigint、int、mediumint、smallint 和 tinyint的取值范围
  9. invalid nib registered for identifier (重用符) - nib must contain exactly one top level object which must be a UITableViewCell instance&#39;
  10. Python脚本:获取股票信息
  11. C语言之全局变量和局部变量
  12. 基于Django的python验证码
  13. Android Data Binding代码实践(告别findViewById)(四)
  14. 沉默的螺旋--digest
  15. W3C------JS
  16. .NET Core SDK在Windows系统安装后出现Failed to load the hostfxr.dll等问题的解决方法
  17. Chrome F12 温故而知新 :因为重定向导致清空Network信息
  18. webpack相关配置
  19. HttpClient--使用HttpClient进行Get Post请求访问
  20. 线程,线程安全与python的GIL锁

热门文章

  1. 黑苹果macOS Sierra 10.12 安装教程(venue11 pro测试)
  2. 如何理解jQuery中的ajaxSubmit方法
  3. 【Unity编程】欧拉角与万向节死锁(图文版)
  4. wemall app商城源码Android之支付宝接口公用函数
  5. 控制语句 for while if switch
  6. 作为一名JAVA程序员应该有怎样的就业思维
  7. 一段获取app性能指标的py脚本
  8. 纯Jquery前端分页
  9. bootstrap file input 官方文档翻译
  10. Oracle DQL查询语言整理