掘金日新计划 · 8 月更文挑战第42天--Listener监听器(三)-开发请求流量统计

81 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第42天,点击查看活动详情

流量统计:统计每分钟有几个请求经过应用,用来监听不同时段应用的数据

1.创建基础项目工程

image.png

2.创建listener包并且新建RequestTotalListener类文件

image.png

public class RequestTotalListener implements ServletContextListener, ServletRequestListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContextEvent:初始化");
        List<String> timeList = new ArrayList<>();
        List<Integer> valueList = new ArrayList<>();
        sce.getServletContext().setAttribute("timeList",timeList);
        sce.getServletContext().setAttribute("valueList",valueList);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContextEvent:销毁");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("ServletRequestEvent:销毁");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("ServletRequestEvent:初始化");
       List<String> timeList =(List)sre.getServletContext().getAttribute("timeList");
       List<Integer> valueList = (List)sre.getServletContext().getAttribute("valueList");
        Date date = new Date();
        SimpleDateFormat  sdf = new SimpleDateFormat("HH:mm");
       String time =  sdf.format(date);
       if(timeList.indexOf(time)==-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);
       }
    }


}

代码说明:

  • contextInitialized:我们知道ServletContext在项目创建的时候可以被监听到,所以我们在项目初始化的时候进行变量变量初始化,分别定义了 timeList和valueList,其中timeList用来记录时间key,value用来记录访问次数
  • requestInitialized:用来记录url被调用时触发的监听,我们在这进行两种情况的判断,如果没有读取到时间,则我们新增key为当前时间,value为1的数组进行赋值,如果有读取到当前的时间变量,则把value值进行加1即可

3.创建controller包并且创建RequestTotalController类文件

package com.imooc.requesttotal.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

@Controller
public class RequestTotalController {
    @GetMapping("get")
    @ResponseBody
    public String get(HttpServletRequest request, HttpServletResponse response){
       List<String> timeList = (List)request.getServletContext().getAttribute("timeList");
       List<String> valueList = (List)request.getServletContext().getAttribute("valueList");
        return timeList.toString()+":"+valueList.toString();

    }
}

代码说明: 控制器用来读取timeList和valuList,为外部提供api接口数据返回

4.启动项目

访问:http://localhost:8085/get image.png
通过不断的刷新,我们可以获取不同的数据统计