Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python 类
首先super,我们都知道他的意思是继承父类的含义,但是python中继承父类的实现可以直接再括号中写例如ChildA和childB,这两个是一样的
Tim在路上
2020/08/05
1.1K0
Python基础(7)——类
定义类使用class关键字,class 后面紧跟着类名称,类名称通常首字母大写,类名称后面(object)代表当前的类的继承自object类。类主要包含属性和方法
羊羽shine
2019/05/28
3700
python面向对象,类
    是面向对象中的俩个重要概念,类是对事物的抽象,比如人类,球类。对象是事物的实例,比如足球,篮球。球类可以对球的特征和行为进行抽象,然后可以实例化一个真实的球体出来。
py3study
2020/01/10
4880
Python 类与继承
self参数用于对当前类中实例的引用,必须作为该类中任何函数的第一个参数,但可以不必命名为 self
回天
2023/04/25
7370
Python 类与继承
Python|面向对象
#一、类、对象定义及使用 #定义类语法:class 类名(父类):代码块注意:()可有可无 #class Student: #class Student(): #创建对象(实例)语法:对象名=类名() 注意:Java语言在实例化对象是,采用new关键字,而Python语言不需要。 #student=Student() #isinstance()语法:isinstance()是检测一个对象是否是一个类的实例,语法格式:isinstance(对象,类),结果返回True和False # class Stu
py3study
2020/01/19
4580
Java开发者的Python快速进修指南:面向对象
当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升。不同于Java中严格的结构和约束,Python在面向对象的实现中展现出更加灵活和自由的特性。它使用了一些独特的关键字,如self和cls,这些不仅增强了代码的可读性,还提供了对类和实例的明确引用。正如Java,Python也依赖于对象和类的概念,允许我们通过定义类来创建和操作对象。尽管在表面上Python和Java在面向对象的实现上看似相似,但实际上,它们在细节处理上存在一些显著的差异。接下来,我们将探索这些差异,并深入了解它们在实际应用中的具体表现,以便更好地理解面向对象编程在不同语言中的独特风格和优势。
努力的小雨
2024/01/03
4360
Python3 的面向对象
# 面向对象 import abc from enum import Enum, unique @unique # unique确保无重复值 class Weekday(Enum): """ 枚举类 """ # 左边为name,右边为value Sun = 0 Mon = 1 Tue = 2 Wed = 3 Thu = 4 Fri = 5 Sat = 6 class Person(metaclass=abc
用户2337871
2020/10/26
3470
Python面向对象总结及类与正则表达式
和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。
py3study
2020/01/16
4780
Python面向对象总结及类与正则表达式
Python基础之(八)类
当类中变量引用的是可变对象是,类属性和实例属性都能直接修改这个对象,从而影响另一方的值。
py3study
2020/01/03
3760
python学习笔记:第16天 面向对象
目录 ⼀、类的成员介绍: 二、类的成员-变量 三、类的成员-方法 四、类的成员-属性 五、私有属性 ⼀、类的成员介绍: ⾸先, 什么是类的成员. 很简单. 我么能在类中写什么? 写的内容就是成员. 到
py3study
2020/01/19
3500
Python面向对象
对象:一个自包含的实体,用一组可识别的特性和行为来标识 类:具有相同的属性和功能的对象的抽象的集合 实例:一个真实的对象,实例化就是创建对象的过程 多态:可对不同类型的对象执行相同的操作,而这些操作就像“被施了魔法”一样能够正常运行 封装:对外部隐藏有关对象工作原理的细节 继承:可基于通用类创建专用类 多态 多态可以让我们在不知道变量指向哪种对象时,也能够对其执行操作,且操作的行为将随对象所属的类型(类)而异。每当不知道对象是什么样就能对其执行操作,都是多态在起作用 多态以 继承 和 重写 父类方法 为前提
Cloud-Cloudys
2020/07/07
7930
Python面向对象的三大特性【封装、继承、多态】
在定义属性或⽅法时,在属性名或者⽅法名前增加两个下划线,定义的就是私有属性或方法。]
叫我阿杰好了
2022/11/07
6730
python学习笔记13-python面
创建对象的过程称之为实例化,当一个对象被创建后,包含三个方面的特性,对象句柄,属性和方法
py3study
2020/01/15
9110
Python面向对象基础
当把number属性变成私有属性__number之后,无法直接访问得到,只能通过get_number和set_number两个函数访问__number属性。
职场亮哥
2020/10/10
1.1K0
Python面向对象基础
Python3快速入门(六)——Pyth
面向对象编程(Object Oriented Programing,OOP)是一种编程思想,OOP把对象当成程序的一个基本单元,一个对象包含数据和操作数据的方法。面向对象编程的三大特性如下: A、封装,可以隐藏实现细节,使代码模块化。 B、继承,可以通过扩展已存在的类来实现代码重用,避免重复编写相同的代码。 C、多态,封装和继承的目的都是为了实现代码重用, 而多态是为了实现接口重用,使得类在继承和派生的时候能够保证任何一个类的实例都能正确调用约定好的属性和方法。 面向对象编程通过封装、继承、多态实现了软件工程的重用性、灵活性、扩展性三个目标。
py3study
2020/01/03
1.4K0
面向对象编程-类
面向对象编程OOP (object-oriented programming)是最有效的软件编写方法之一,面向对象是利用“类”和“对象”来创建各种模拟来实现对真实世界的描述,使用面向对象编程的原因一方面试因为它可以使程序的维护和扩展变得简单, 并且可以大大提高程序开发效率,面向对象的程序可以让人更加理解代码的逻辑。面向对象的核心特性之一:Class 类 一个类即是对一类拥有相同属性的对象的抽象,蓝图,原型。在类中定义了这些对象的都具备的属性,共同的方法。根据类来创建对象被称为实例化,这能够使用类的实例。 类
用户1679793
2018/04/28
9050
面向对象编程-类
30天拿下Python之面向对象编程
在上一节,我们介绍了Python的函数,包括:函数的定义、函数的调用、参数的传递、lambda函数等内容。在本节中,我们将介绍Python的面向对象编程。面向对象编程(Object-Oriented Programming, 即OOP)是一种编程范型,它以对象为基础,将数据和操作封装在一个类(Class)中。在Python中,类是一种定义对象结构和行为的模板,而对象则是类的实例。类定义了一个新的类型,用于创建具有特定属性和方法的对象。类是面向对象编程的核心,它允许程序员使用对象来组织代码和复用代码。
用户6256742
2024/06/22
890
Python面向对象编程-完整版
面向对象是一种编程范式。范式是指一组方法论。编程范式是一组如何组织代码的方法论。编程范式指的是软件工程中的一种方法学。
1846122963
2018/07/26
1.3K0
玩转Python属性和方法,成为高手不再难!
Python是一种简洁而强大的编程语言,其支持面向对象的编程范式。在Python中,属性和方法是面向对象编程的核心概念之一。本文将从入门到精通介绍Python中的属性和方法,帮助你深入了解这些重要的概念,并学会如何在实际开发中灵活应用它们。
子午Python
2023/07/30
3540
python面向对象编程指南 pdf_python面向对象的三个基本特征
  抽象是隐藏多余细节的艺术。在面向对象的概念中,抽象的直接表现形式通常为类。虽然Python是解释性语言,但是它是面向对象的,从设计之初就已经是一门面向对象的语言。Python基本上提供了面向对象编程语言的所有元素,如果你已经至少掌握了一门面向对象语言,那么利用Python进行面向对象程序设计将会相当容易。下面就来了解一下如何在Python中进行对象编程。
全栈程序员站长
2022/11/16
7560
相关推荐
python 类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验