Java实现网站请求流量分析统计

 

如上图所描绘的,在不断刷新test.html请求页面时,上图total.html页面会实时的更新(1秒响应更新一次),折线图会实时进行上下变动。其中需要导入echarts.min.js和jquery-3.5.1.min.js和fastjson-1.2.53.jar包。

0.首先是创建RequestServlet这个类,创建一个时间集合和与之相对象的值集合,就是每一时间段,有多少的请求数量。比如上图19:14时间段有20多个请求量。代码如下:

package com.wei.total;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;



/**
 * Servlet implementation class RequestServlet
 */
@WebServlet("/req")
public class RequestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public RequestServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		ServletContext context = request.getServletContext();// 获得全局对象
		List<String> timeList = (List<String>) context.getAttribute("timeList");
		List<Integer> valueList = (List<Integer>) context.getAttribute("valueList");
		response.setContentType("text/html;charset=utf-8");
//		response.getWriter().println(timeList.toString());
//		response.getWriter().println("<br/>");
//		response.getWriter().println(valueList.toString());
		
		
		Map resultMap=new HashMap();
		resultMap.put("timeList",timeList );
		resultMap.put("valueList",valueList );
		String json=	JSON.toJSONString(resultMap);
		response.getWriter().println(json);
			
		
	}

}

1.然后是RequestTotalListener这个类实现  ServletContextListener,ServletRequestListener两个接口,代码如下:

package com.wei.total;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;

public class RequestTotalListener implements ServletContextListener,ServletRequestListener {

	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
	HttpServletRequest request=(HttpServletRequest)sre.getServletRequest();
	String url=request.getRequestURL().toString();
	if (url.endsWith("/req")==true) {
		return;
	}
		// TODO Auto-generated method stub
		//timeList: 10:02,10:03,10:04
		//ValueList  5       20    15
	List<String> timeList=(List)sre.getServletContext().getAttribute("timeList");
	List<Integer> valueList=(List)sre.getServletContext().getAttribute("valueList");
	
	Date date =new Date();
	
	SimpleDateFormat sdfDateFormat=new SimpleDateFormat("HH:mm");
	String time=sdfDateFormat.format(date);//得到当前时间
	//10:05
	if (timeList.indexOf(time)==-1) {//查找对应的数据集合中是否存在,时间是否存在,不存在返回结果为-1
		timeList.add(time);
		valueList.add(1);
		sre.getServletContext().setAttribute("timeList", timeList);
		sre.getServletContext().setAttribute("valueList", valueList);
	}else {
	int index=	timeList.indexOf(time);
	int value=valueList.get(index);
	valueList.set(index,value+1);
	sre.getServletContext().setAttribute("valueList", valueList);
	}
	}
	
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		ServletContextListener.super.contextDestroyed(sce);
	}
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		List timeList=new ArrayList();
		List valueList=new ArrayList();
		
		sce.getServletContext().setAttribute("timeList", timeList);
		sce.getServletContext().setAttribute("valueList", valueList);
	}
}

2.进行数据统计页面total.html的编写:代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/echarts.min.js"></script>
<script type="text/javascript" src="js/jquery-3.5.1.min.js"></script>
</head>
<body>
	<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
	<div id="main" style="width: 600px; height: 500px;"></div>

	<script type="text/javascript">
	function showChart(){
		$.ajax({
			url:"./req",
			type:"get",
			dataType:"json",
			success:function(json){
				console.log(json.timeList);
				console.log(json.valueList);
				
				// 基于准备好的dom,初始化echarts实例
				var myChart = echarts.init(document.getElementById('main'));//得到图表对象

				// 指定图表的配置项和数据
				var option = {
					title : {
						text : '请求流量分析统计'
					},
					tooltip : {},
					legend : {
						data : [ '访问量' ]
					},
					xAxis : {
						data : json.timeList
					},
					yAxis : {},
					series : [ {
						name : '访问量',
						type : 'line',//bar柱状图,line折线图
						data : json.valueList
					} ]
				};

				// 使用刚指定的配置项和数据显示图表。
				myChart.setOption(option);
			}
		})
	}
		window.setInterval("showChart()",1000);//1秒向浏览器刷新一次结果
	</script>
</body>
</html>

3.测试页面,可以准备多个测试页面,一定要注意html页面一定要在webcontent下进行创建,发布后,打开进行多次点击,可以发现total.html的折线图会实时的进行变化,也可以换成树状图等图。代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>我是第一个测试页面</h1>
<h2>I am test page one</h2>
</body>
</html>

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光不锈@

如果有帮助的话,打赏一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值