分IP统计网站访问次数(过滤器实现)

统计网站访问次数

1. 说明

网站统计每个IP地址访问本网站的次数。
预期效果:
在这里插入图片描述

2. 分析

① 确定用什么来统计网站的访问次数?
因为网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,也就是说统计工作在任何的资源被访问之前都要执行,所以使用过滤器比较方便。而且我们的这个过滤器不需要任何的拦截操作,只需要统计次数就可以了。
② 用什么来存储网站中每个IP的访问次数?
我们需要用什么来装载统计数据呢?答案是Map<String,Integer>,我们可以在过滤器中创建一个Map,key就是IP地址,value就是对应IP地址访问的次数。
当有用户访问时,就获取请求的IP地址:如果这个IP在map中存在,就说明以前访问过,就在访问次数上+1;如果IP在map中不存在,就设置访问次数为1。
③ Map怎么创建?存放在哪里?
这个Map什么时候创建呢,我们可以使用监听器,也就是使用ServletContextListener,在服务器启动的时候完成创建,并且存放到ServletContext中。

3. 代码

① 创建资源

首先我们创建一些资源,供访问使用。这里我新建两个jsp,随便写一些内容。
在这里插入图片描述

② 创建监听器

接下来创建一个监听器,让其在服务器启动的时候创建一个Map,并且保存到ServletContext中。

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

③ 创建过滤器

接下来创建一个过滤器,命名为AFilter。
web.xml的有关配置如下:

<filter>
	<display-name>AFilter</display-name>
	<filter-name>AFilter</filter-name>
	<filter-class>com.veeja.web.filter.AFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>AFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

AFilter的代码如下,功能和具体的步骤都写在注释里:

/**
 * 从application中获取Map. 从request中得到IP地址. 进行统计工作,结果保存到Map中
 * 
 * @author Veeja.Liu
 * @emial veejaliu@gmail.com
 * 
 */
public class AFilter implements Filter {
	private FilterConfig config = null;

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 获取application中的map
		ServletContext application = config.getServletContext();
		Map<String, Integer> map = (Map<String, Integer>) application.getAttribute("map");
		// 从request中获取当前客户端的ip地址
		String ip = request.getRemoteAddr();
		// 查看Map中是否有这个IP对应的数据,如果有就把访问次数+1,再保存回去
		if (map.containsKey(ip)) {
			int cnt = map.get(ip);
			map.put(ip, cnt + 1);
		} else {
			// 如果不存在,就设置访问次数为1
			map.put(ip, 1);
		}
		// 把Map放回到application中,这一步的操作其实有没有都可以,因为我们获取的是引用的值
		application.setAttribute("map", map);

		chain.doFilter(request, response);
	}

	/**
	 * 在服务器启动的时候就会执行本方法,而且只执行一次
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		this.config = fConfig;
	}

}

④ 创建一个显示页面

最后我们创建一个show.jsp,用来显示我们的统计数据。

<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>

4. 运行结果

我们运行项目,浏览器中随便访问几个网页,然后查看访问show.jsp,看到,结果是完全OK的:
在这里插入图片描述


以上就是全部内容,谢谢你的阅读。

如有纰漏,请不吝指出,不胜感激。

如果你不沉下心来认真练习,所有的阅读都是白费的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值