使用javaWeb的二大(Listener、Filter)组件实现分IP统计访问次数
分析:
统计工作需要在所有资源之前都执行,那么就可以放到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统计访问次数的更多相关文章
- filter应用案例一:分IP统计访问次数
统计工作需要在所有资源之前都执行,那么就可以放到Filter中了.用Map<String,Integer>装载统计的数据.Map创建时间(使用ServletContextListener, ...
- Filter和Listener的应用——分IP统计网站访问次数
一:分析 统计工作需要在所有资源执行前进行,所以需要放在filter中 这个拦截器仅仅进行统计工作,不进行拦截,所以请求必须继续传递下去 用Map<String,integer>来保存数据 ...
- javaweb(4)之Listener&Filter
监听器 (Listener) 介绍 监听器用于监听 web 应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器 ...
- Java web 实现 之 Filter分析ip统计网站的访问次数
统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的. 用什么东西来装载统计的数据.Map<String,Integer& ...
- JavaWeb 三大器--Listener、Filter 和Interceptor 总结
说明:web.xml的加载顺序是:[Context-Param]->[Listener]->[Filter]->[Servlet],而同个类型之间的实际程序调用的时候的顺序是根据对应 ...
- javaWeb学习之Listener监听
] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet listener filt ...
- servlet,listener,filter,interceptor的关系
1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.最早支持 Servlet 技术 ...
- web.xml中的主要元素说明(listener, filter, servlet)
web.xml中加载的顺序为:context-param ---> listener ---> filter ---> servlet. listener:主要针对的是对象的操作,如 ...
- web.xml之context-param,listener,filter,servlet加载顺序及其周边
先以加载spring为例子看看加载顺序的作用: Spring加载可以利用ServletContextListener 实现,也可以采用load-on-startup Servlet 实现,但比如fil ...
随机推荐
- pip 安装指定版本软件包
默认情况下,pip 将安装最新版本的软件包,但有时需要获取特定版本的安装包,比如 jinja2 从 2.9 开始加入了 async 关键字,这个会导致 py2exe 报错:Invalid Syntax ...
- 提取http接口响应报文中需要的值,获得的是string,使用dict转换为字典处理
- 初学Python——文件操作第三篇
一.引言 什么?有了第二篇文件操作还不够?远远不够!而且在读完第三篇文件操作还是不够.关于文件的操作,后续的学习中将不断学习新的操作方式,使用更加合适的方法. 进入正题,上一篇讲到,Python对文件 ...
- Linux并发与同步专题
并发访问:多个内核路径同时访问和操作数据,就有可能发生相互覆盖共享数据的情况,造成被访问数据的不一致. 临界区:访问和操作共享数据的代码段. 并发源:访问临界区的执行线程或代码路径. 在内核中产生并发 ...
- 设计模式(5)原型模式(Prototype)
设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 设 ...
- 20175234 数据库MySQL(课下作业)
20175234 数据库MySQL(课下作业) 内容: 1.下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SE ...
- 移动前端webApp开发点滴积累20140524
#webApp开发几点体会(移动前端) ##前言 本文旨在记录本人涉足移动webApp开发的几点体会,欢迎分享与指正. ##再见,IE678 移动设备,Android跟iPhone是主流,即使是win ...
- 一次掌握 React 与 React Native 两个框架
此系列文章将整合我的 React 视频教程与 React Native 书籍中的精华部分,给大家介绍 React 与 React Native 结合学习的方法. 1. 软件开发语言与框架的学习本质 我 ...
- Windows下的两个缺陷
记事本缺陷: 标题:新建记事本中仅输入“联通”,保存关闭后再打开,显示为乱码 详细描述: 环境说明:操作系统ALL 重现步骤: 1.新建一个记事本,在其中仅输入“联通”两个字 2.再将该记事本关闭保存 ...
- 结对项目——图形界面实现与dll动态链接
先来一发软件截图~~~ 生成题目的界面 测评界面 第三块本来准备做一个文件历史记录的界面,但是由于时间不够,暂时还没做完. 图形界面的设计与实现 由于对传统的对话框风格不太满意,所以这次作业的图形界面 ...