前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >分ip统计网站的访问次数

分ip统计网站的访问次数

作者头像
星哥玩云
发布于 2022-09-14 13:04:53
发布于 2022-09-14 13:04:53
2.1K00
代码可运行
举报
文章被收录于专栏:开源部署开源部署
运行总次数:0
代码可运行

1、分ip统计网站的访问次数

统计工作需要在所有资源之前都执行,那么就可以放到Filter中了。

我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的。

用什么东西来装载统计的数据。Map<String,Integer>

整个网站只需要一个Map即可!

Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中),Map保存到哪里!(Map保存到ServletContext中!!!)

  • Map需要在Filter中用来保存数据
  • Map需要在页面使用,打印Map中的数据

2、说明

网站统计每个IP地址访问本网站的次数。

3、分析

因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便。

因为需要分IP统计,所以可以在过滤器中创建一个Map,使用IP为key,访问次数为value。当有用户访问时,获取请求的IP,如果IP在Map中存在,说明以前访问过,那么在访问次数上加1,即可;IP在Map中不存在,那么设置次数为1。

把这个Map存放到ServletContext中!

4、代码

监听器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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("ipCountMap", map);
    }

    public void contextDestroyed(ServletContextEvent sce) {
    }
}

配置监听器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <listener>
    <listener-class>com.tyschool.web.listener.AListener</listener-class>
  </listener>

index.jsp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <body>
<h1>IP统计访问次数</h1>
<table align="center" width="50%" border="1">
	<tr>
		<th>IP地址</th>
		<th>次数</th>
	</tr>
<c:forEach items="${applicationScope.ipCountMap }" var="entry">
	<tr>
		<td>${entry.key }</td>
		<td>${entry.value }</td>
	</tr>
</c:forEach>
 </table>
  </body>

IPFilter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class IPFilter implements Filter {
	private ServletContext context;

	public void init(FilterConfig fConfig) throws ServletException {
		context = fConfig.getServletContext(); 
		Map<String, Integer> ipCountMap = Collections
				.synchronizedMap(new LinkedHashMap<String, Integer>());
 		context.setAttribute("ipCountMap", ipCountMap);
	}

	@SuppressWarnings("unchecked")
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		String ip = req.getRemoteAddr(); 

		Map<String, Integer> ipCountMap = (Map<String, Integer>) context
				.getAttribute("ipCountMap");
 
		Integer count = ipCountMap.get(ip); 
		if (count == null) {
			count = 1;
 		} else {
			count += 1; 
		}
		ipCountMap.put(ip, count); 

		context.setAttribute("ipCountMap", ipCountMap); 
		chain.doFilter(request, response); 
	}

	public void destroy() {}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <filter>
    <display-name>IPFilter</display-name>
    <filter-name>IPFilter</filter-name>
    <filter-class>cn.itcast.filter.ip.IPFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>IPFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验