使用ServletRequestListener监听器实现对网站访问流量的监控

ServletRequestListener

ServletRequestListener接口能监听每一个request的请求的创建和销毁,用来记录网站的浏览量非常合适,可以按照每一分钟来统计有多少request请求,请求产生的数据技术则可以放在ServletContext全局对象中进行设置和读取
实现requestInitialized()方法

	@Override
	public void requestInitialized(ServletRequestEvent arg0) {
		HttpServletRequest hsr= (HttpServletRequest)arg0.getServletRequest();
		//过滤统计请求,避免多计算
		String url= hsr.getRequestURL().toString();
		if(url.endsWith("/reqt")){
			return;
		}
		//获取ServletContext
		ServletContext sc =arg0.getServletContext();
		List<String> timelist =(List)sc.getAttribute("timelist");
		List<Integer> valuelist =(List)sc.getAttribute("valuelist");
		Date now =new Date();
		SimpleDateFormat sdf =new SimpleDateFormat("MM-dd HH:mm");
		String min= sdf.format(now);
		if(timelist.indexOf(min)==-1){//新的一分钟
			timelist.add(min);
			valuelist.add(1);
			sc.setAttribute("timelist", timelist);
			sc.setAttribute("valuelist", valuelist);
		}else{
			int index =timelist.indexOf(min);
			int value=valuelist.get(index);
		    valuelist.set(index, value+1);
			sc.setAttribute("valuelist", valuelist);
		}		
	}

ServletContextListener

实现该接口,在web服务初始化的时候,可以将每分钟的访问量数据list和时间变化的list放在ServletContext对象中作为一个全局变量
ServletContext初始化初始化时的操作:

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		ServletContext sc = arg0.getServletContext();
		List timelist =new ArrayList();
		List valuelist =new ArrayList();
		sc.setAttribute("timelist", timelist);
		sc.setAttribute("valuelist", valuelist);	
	}

剩下需要做的是有一个页面来显是网站网站访问量的数据,并且实现实时一秒刷新一次,实时显示每分钟的访问量,需要用的到一个servlet,处理网站流量统计界面的后台请求
界面使用白的开源项目echarts来展示数据效果,前台的请求可以用jquery的$.ajax()实现数据交互

servlet如下:
需要用到阿里款的fastjson jar包,实现对象的序列化转成json字符串

@WebServlet(urlPatterns = "/reqt")
public class ReqtServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ServletContext sc = req.getServletContext();
		List<String> timelist = (List) sc.getAttribute("timelist");
		List<Integer> valuelist = (List) sc.getAttribute("valuelist");
		Map<String,List> map =new HashMap<String,List>();
		map.put("timelist", timelist);
		map.put("valuelist", valuelist);
		//fastjson 对象序列化
		String json =JSON.toJSONString(map);
		resp.getWriter().println(json);
	}

在数据统计页面引入js文件和画一个图标容器的对象

<script src="js/echarts.min.js"></script>
<script src="js/jquery.3.3.1.min.js"></script>
<body>
	<div id="main" style="width: 600px;height:400px;"></div>
</body>
<script type="text/javascript">
	function showEchart() {
		$.ajax({
			url : "/reqt",
			type : "get",
			dataType : "json",
			success : function(json) {
				console.log(json);
				// 以下这段代码时从echarts官网上复制过来的demo
				var myChart = echarts.init(document.getElementById('main'));
				// 指定图表的配置项和数据
				var option = {
					title : {
						text : '网站访问流量统计'
					},
					tooltip : {},
					legend : {
						data : [ '访问量' ]
					},
					xAxis : {
						data : json.timelist
					},
					yAxis : {},
					series : [ {
						name : '访问量',
						type : 'line',
						data : json.valuelist
					} ]
				};
				// 使用刚指定的配置项和数据显示图表。
				myChart.setOption(option);
			},
			error : function() {}
		});
	}
	//js定时器函数,1000是一秒,意思是一秒执行该函数一次
	window.setInterval("showEchart()", 1000);
</script>

最终实现的效果如下:
在这里插入图片描述

发布了31 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/cchulu/article/details/104740346