JavaWeb学习:在SSM框架中配置一个简单的监听器和过滤器

实现效果:

编写一个记录有多少个请求访问的监听器,通过面向全部访问路径的过滤器更新监听器中的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注解并声明相关信息!/*则说明对所有请求进行过滤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值