一、场景
使用Spring Boot框架,通过监听器记录网站访问人数和网站访问量。
二、实现
1.通过监听器创建存储访问信息的初始化变量
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {logger.info("ServletContext上下文初始化");servletContextEvent.getServletContext().setAttribute("count",new HashMap<>());
}
2.通过过滤器获取自定义的初始化变量,并存入请求信息(包括请求路径和IP地址)
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {logger.info("doFilter方法执行了");HttpServletRequest request = (HttpServletRequest) servletRequest;if (count.containsKey(servletRequest.getRemoteAddr())) {List<StringBuffer> user_urls =(ArrayList) count.get(servletRequest.getRemoteAddr());user_urls.add(request.getRequestURL());count.put(servletRequest.getRemoteAddr(),user_urls);} else {List<StringBuffer> user_urls = new ArrayList<>();user_urls.add(request.getRequestURL());count.put(servletRequest.getRemoteAddr(),user_urls);}logger.info("访问人数:"+count.entrySet().size());
}
3.打印访问人数和访问量
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {logger.info("ServletContext上下文初销毁");Map<String,Object> count =(Map<String, Object>) servletContextEvent.getServletContext().getAttribute("count");logger.info("访问人数:"+count.entrySet().size());Integer num = 0;for (Map.Entry<String, Object> item:count.entrySet()) {List<StringBuffer> list =(ArrayList) item.getValue();num += list.size();}logger.info("访问量:"+num);
}
4.完整代码
监听器
package com.example.hw3.listener;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequest;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@WebListener
public class CommonListener implements ServletContextListener {private Logger logger = LoggerFactory.getLogger(this.getClass());@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {logger.info("ServletContext上下文初始化");servletContextEvent.getServletContext().setAttribute("count",new HashMap<>());}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {logger.info("ServletContext上下文初销毁");Map<String,Object> count =(Map<String, Object>) servletContextEvent.getServletContext().getAttribute("count");logger.info("访问人数:"+count.entrySet().size());Integer num = 0;for (Map.Entry<String, Object> item:count.entrySet()) {List<StringBuffer> list =(ArrayList) item.getValue();num += list.size();}logger.info("访问量:"+num);}
}
过滤器
package com.example.hw3.filter;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;@WebFilter(filterName = "commonFilter",urlPatterns = "/*")
public class CommonFilter implements Filter {private Logger logger = LoggerFactory.getLogger(this.getClass());private Map<Object,Object> count;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {logger.info("init方法执行了");count = (Map<Object, Object>) filterConfig.getServletContext().getAttribute("count");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {logger.info("doFilter方法执行了");HttpServletRequest request = (HttpServletRequest) servletRequest;if (count.containsKey(servletRequest.getRemoteAddr())) {List<StringBuffer> user_urls =(ArrayList) count.get(servletRequest.getRemoteAddr());user_urls.add(request.getRequestURL());count.put(servletRequest.getRemoteAddr(),user_urls);} else {List<StringBuffer> user_urls = new ArrayList<>();user_urls.add(request.getRequestURL());count.put(servletRequest.getRemoteAddr(),user_urls);}logger.info("访问人数:"+count.entrySet().size());}@Overridepublic void destroy() {logger.info("destroy方法执行了");}
}
三、测试
多次访问服务器地址
关闭项目可查看访问人数和访问量