实现效果:
编写一个记录有多少个请求访问的监听器,通过面向全部访问路径的过滤器更新监听器中的visitCount次数。
监听器:
@WebListener
public class VisitCounterListener implements ServletContextListener {
private static final String VISIT_COUNT_ATTRIBUTE = "visitCount";
@Override
public void contextInitialized(ServletContextEvent sce) {
// Web应用启动时初始化访问次数为0
sce.getServletContext().setAttribute(VISIT_COUNT_ATTRIBUTE, 0);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
// 增加一个用于增加访问次数的方法,这将在过滤器中被调用
public static void incrementVisitCount(ServletContext servletContext) {
Integer visitCount = (Integer) servletContext.getAttribute(VISIT_COUNT_ATTRIBUTE);
if (visitCount == null) {
visitCount = 0;
}
servletContext.setAttribute(VISIT_COUNT_ATTRIBUTE, visitCount + 1);
System.out.println("访问次数:" + visitCount);
}
// 提供一个获取当前访问次数的方法,供其他组件使用
public static int getVisitCount(ServletContext servletContext) {
Integer visitCount = (Integer) servletContext.getAttribute(VISIT_COUNT_ATTRIBUTE);
return visitCount != null ? visitCount : 0;
}
}
注意!一定要加上@WebListener注解!在WebConfig配置类中声明listener的bean组件好像没有用,只有通过注解才能正确注入容器。
过滤器:
@WebFilter(filterName = "VisitCounterFilter", urlPatterns = "/*")
public class VisitCounterFilter implements Filter {
private static final Logger logger = Logger.getLogger(VisitCounterFilter.class.getName());
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("VisitCounterFilter初始化...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 强制类型转换为HttpServletRequest,因为我们知道在Web应用中通常处理的是HTTP请求
HttpServletRequest httpRequest = (HttpServletRequest) request;
ServletContext servletContext = httpRequest.getServletContext();
// 在请求处理之前增加访问次数
VisitCounterListener.incrementVisitCount(servletContext);
// 打印访问次数
logger.info("VisitCounterFilter.doFilter start"); // 进入过滤器时记录日志
System.out.println("访问次数:" + VisitCounterListener.getVisitCount(servletContext));
logger.info(VisitCounterListener.getVisitCount(servletContext) + "");
// 继续过滤器链
chain.doFilter(request, response);
logger.info("VisitCounterFilter.doFilter end"); // 离开过滤器时记录日志
}
@Override
public void destroy() {
System.out.println("VisitCounterFilter销毁");
}
}
注意:同样的!需要使用@WebFilter注解并声明相关信息!/*则说明对所有请求进行过滤