当前位置: 首页 > news >正文

过滤器filter,监听器Listener

过滤器(filter)


将浏览器请求的数据进行过滤,对于服务器向浏览器的相应进行过滤

//TODO:当访问/servlet1时,会先经过MyFilter1过滤器,再经过MyServlet1
@WebFilter("/servlet1")
public class MyFilter1 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter1过滤器执行了");
        // 放行,继续执行下一个过滤器或目标资源
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

Filter的生命周期:

初始化方法(init):

Filter的创建和销毁由Web服务器负责(Tomcat)

拦截请求方法(doFilter):

当浏览器客户端访问与过滤器有关联的URL的时候,Servlet过滤器会先执行doFilter方法,在通过FilterChain参数访问后续的过滤器或者直接访问对应的资源

销毁方法(destroy):

Filter对象在创建了之后会驻留在内存中,当Web应用移除的时候或者服务器停止的时候才会销毁,在Web容器卸载Filter对象之前被调用,用于释放过滤器使用的资源。

@WebFilter("/servlet1")
public class MyFilter2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter2过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter2过滤器执行了");
        // 放行,继续执行下一个过滤器或目标资源
        filterChain.doFilter(servletRequest,servletResponse);
    }

    //关闭Tomcat的时候会执行该方法
    @Override
    public void destroy() {
        System.out.println("MyFilter2过滤器销毁");
    }
}

过滤器实现设置字符编码

//过滤器实现设置字符编码
@WebFilter("/servlet2")
public class MyFilter3 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // TODO:设置为utf-8编码
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        request.setCharacterEncoding("UTF-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

通过Filter实现页面总的统计量PV:通过Ctrl+shift+delete去进行清除缓存

//TODO:通过Filter实现统计页面总的访问量PV
@WebFilter("/*")
public class MyFilter4 implements Filter {
    private final static String PV_COUNT = "pvCount";
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        ServletContext application = request.getServletContext();

        Integer count = (Integer)application.getAttribute(PV_COUNT);
        if (count == null){
            //第一次访问
            application.setAttribute(PV_COUNT,1);
        }else {
            //不是第一次访问
            int count1 = count;
            application.setAttribute(PV_COUNT,count1+1);
        }
        System.out.println("当前的页面访问量为:"+ application.getAttribute(PV_COUNT));
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

监听器(Listener)


在Javaweb中用于监听Servlet的三个作用域的程序就是监听器,Javaweb的Servlet作用域对象:ServletContext/HttpSession/HttpServletRequest三个对象

(应用程序/会话/请求)—》三个对象

监听器的基础:

监听生命周期的变化:

ServletContextListener:监听ServletContext生命周期

HttpSessionListener:监听HttpSession生命周期

HttpServletRequestListener:监听HttpServletRequest生命周期

监听属性变化:(setAttribute,getAttribute,removeAttribute)

ServletContextAttributeListener:监听ServletContext属性变化

HttpSessionAttributeListener:监听HttpSessionListener属性变化

HttpServletRequestAttributeListener:监听HttpServletRequest属性变化


Request域的监听器:–一次请求的时间是很短的

两个监听器的接口

ServletRequestListener:生命周期监听

ServletRequestAttributeListener:属性监听

@WebListener
public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener {
    // 请求初始化监听
    public void requestInitialized(javax.servlet.ServletRequestEvent servletRequestEvent) {
        System.out.println("请求初始化");
    }

    // 请求销毁监听
    public void requestDestroyed(javax.servlet.ServletRequestEvent servletRequestEvent) {
        System.out.println("请求销毁");
    }
    // 请求属性添加监听
    public void attributeAdded(javax.servlet.ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("添加属性");
    }
    // 请求属性删除监听
    public void attributeRemoved(javax.servlet.ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("删除属性");
    }
    // 请求属性替换监听
    public void attributeReplaced(javax.servlet.ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("替换属性");
    }
}


Session域的监听器:

两个监听器的接口

HttpSessionListener:生命周期监听

HttpSessionAttributeListener:属性监听

@WebListener
public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        System.out.println("SessionListener监听到属性添加了");
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        System.out.println("SessionListener监听到属性删除了");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        System.out.println("SessionListener监听到属性替换了");
    }

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("SessionListener监听到session创建了");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("SessionListener监听到session销毁了");
    }
}


ServletContext域的监听器:

两个监听器的接口

ServletContextListener:生命周期监听—Tomcat一启动就监听

ServletContextAttributeListener:属性监听

public class ContextListener implements ServletContextListener, ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("ServletContextAttributeListener监听器监听到ServletContext的属性被添加了");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContextListener监听器监听到ServletContext被销毁了");
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContextListener监听器监听到ServletContext被创建了");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        System.out.println("ServletContextAttributeListener监听器监听到ServletContext的属性被替换了");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println("ServletContextAttributeListener监听器监听到ServletContext的属性被移除了");
    }
}

相关文章:

  • Java日志进化论:从System.out.println到日志框架的全面升级
  • 青少年编程与数学 02-013 初中数学知识点 02课题、概要
  • 习题2.1
  • 【免费】2007-2019年各省地方财政医疗卫生支出数据
  • J2EE框架技术 第三章 SSM项目的CURD
  • Netty源码—10.Netty工具之时间轮一
  • BAR帧处理
  • 怎样提升大语言模型(LLM)回答准确率
  • MySQL内存使用率高问题排查与解决方案:
  • Windows10上部署DeepSeek+RAG知识库操作详解(Dify方式)之1
  • GAMES101-现代计算机图形学入门(Assignment7)
  • sql优化子查询展开执行计划测试
  • 【Deepseek】企业AI DeepSeek战略课
  • 生产者消费者模型
  • 金融级密码管理器——密码泄露监控与自动熔断
  • leetcode -编辑距离
  • opencv图像处理之指纹验证
  • Python助力无人机智能路径规划:从理论到实践
  • uniapp选择文件使用formData格式提交数据
  • Vue3 表单
  • 山东省住房建设厅网站考试项目/什么是淘宝seo
  • 资讯网站 怎么做/房地产十大营销手段
  • 武汉seo网站推广公司武汉/站长之家素材网
  • 茶叶网络营销网站建设论文/搜索软件使用排名
  • 多国语言网站建设/搜狗整站优化
  • 网站建设发票的税点/网络推广免费平台