一、场景
使用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());
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
logger.info("ServletContext上下文初始化");
servletContextEvent.getServletContext().setAttribute("count",new HashMap<>());
}
@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);
}
}
过滤器
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;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("init方法执行了");
count = (Map<Object, Object>) filterConfig.getServletContext().getAttribute("count");
}
@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());
}
@Override
public void destroy() {
logger.info("destroy方法执行了");
}
}
三、测试
多次访问服务器地址
关闭项目可查看访问人数和访问量