Filter和Listener的应用——分IP统计网站访问次数
一:分析
统计工作需要在所有资源执行前进行,所以需要放在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统计网站访问次数的更多相关文章
- 分ip统计网站访问次数
package web.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; ...
- 学习笔记_过滤器应用_1(分ip统计网站的访问次数)
分ip统计网站的访问次数 ip count 192.168.1.111 2 192.168.1.112 59 统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做 ...
- filter应用案例一:分IP统计访问次数
统计工作需要在所有资源之前都执行,那么就可以放到Filter中了.用Map<String,Integer>装载统计的数据.Map创建时间(使用ServletContextListener, ...
- php统计网站访问次数的一个简单方法
这里主要用到了session保存当前访问者,并将访问次数写入本地文件. <? @session_start(); $counter = intval(file_get_contents(&quo ...
- Java web 实现 之 Filter分析ip统计网站的访问次数
统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的. 用什么东西来装载统计的数据.Map<String,Integer& ...
- Java web--Filter过滤器分IP统计访问次数
分IP统计访问次数即网站统计每个IP地址访问本网站的次数. 分析 因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便. 因为需要分IP统计,所以可以在过滤器中创建 ...
- JSP简单实现统计网页访问次数
JSP简单实现统计网页访问次数 需求:统计网页的访问次数 核心思想:利用application对象,将访问次数的信息放入application对象中,每次访问就+1.这里利用了application对 ...
- 【JAVA系列】使用JavaScript实现网站访问次数统计代码
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[JAVA系列]使用JavaScript实现网站 ...
- 使用javaWeb的二大(Listener、Filter)组件实现分IP统计访问次数
分析: 统计工作需要在所有资源之前都执行,那么就可以放到Filter中. 我们这个过滤器不打算做拦截操作!因为我们只是用来做统计 用什么东西来装载统计的数据.Map<String,Integer ...
随机推荐
- 深究WeixinJSBridge未定义之因
对于一个没有使用微信JS-SDK的网站来说,我们竟然收到了WeixinJSBridge is not defined 的报错: 去网上一搜,发现很多开发者都遇到类似的问题: 我的微信项目,没有用到微信 ...
- 1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 9203 Solved: 3097[Submit][Stat ...
- 当前最上层的视图控制器vc 和 当前最上层的导航控制器nav
在处理 URL Router 跳转的时候,我们经常需要得到 当前最上层的视图控制器 和 当前最上层的导航控制器 来进行视图跳转或者方法调用.- (UIViewController *)currentV ...
- tomcat文件夹没有部署项目和Tomcat中webapps中没有运行项目-上传下载文件和图片
1.eclipse不像MyEclipse默认将项目部署到tomcat安装目录下的webapps中,而默认部署到工作目录下的.metadata.plugins\org.eclipse.wst.serve ...
- android 透明状态栏方法及其适配键盘上推(二)
在上一篇文章中介绍了一种设置透明状态栏及其适配键盘上推得方法.但是上一篇介绍的方法中有个缺点,就是不能消除掉statusbar的阴影.很多手机如(三星,Nexus都带有阴影).即使我用了: <a ...
- SignalR指定用户推送消息
一.首先,在MVC项目中安装SingalR包(SingalR2.0需要.net4.5以上,VS2010可以安装1.1.3版本,本例为VS2010+SignalR1.1.3). 打开工具-NuGet程序 ...
- HTML5微数据
本篇文章是一个纯搬运贴,原博主是在是做的太详细了 原贴地址:http://www.zhangxinxu.com/wordpress/2011/12/html5扩展-微数据-丰富网页摘要/ 一.微数据是 ...
- Linux文件权限rwx简单了解
Ⅰ 了解Linux下的文件权限 如上图所示,ll命令详细展示当前目录下的文件或者子目录信息 红框标注的即为此文件或者目录的权限 [第一行文件10.c的权限以-开头,用来说明这是一个文件:第四行cod ...
- FDG内存分配器笔记
FDG: 大规模并行系统中的动态内存分配器由于需要全局同步(记账) ,导致性能急剧下降. 代码解析 1.superblock 类中包含两个变量,两个函数.默认superblock大小为2048 ite ...
- (转)Zabbix Agent-Windows平台配置指导
原地址:http://blog.itpub.net/26739940/viewspace-1169538/ zabbix是一个CS结构的监控系统,支持ping,snmp等很多的监控,但是大部分 ...