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

最終實現的效果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章