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

Listener监听器和Filter过滤器

一.监听器

1.是javaweb的三大组件之一,分别是Servlet程序,Listener监听器,Filter过滤器
2.Listener是JvaEE的规范,就是接口,监听器的作用就是监听某种变化(一般是对象创建/销毁,属性变化),触发对应方法完成相应的任务
3.ServletContextListener:
/*当一个类实现了ServletContextListener,该类就是一个监听器
 * 该类可以监听的事件由该类实现的接口决定,比如下面该类就能监听ServletContext对象的创建和销毁
 *  当web应用启动时,就会产生ServletContextEvent事件,会调用监听器的对应事件处理方法contextInitialized
 * 同时会传递事件对象,程序员通过ServletContextEvent事件对象来获取需要的信息,然后处理业务
 * tomcat怎么知道这个监听器存在? 因为需要在web.xml文件中配置*/
public class HspServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();
        System.out.println("该监听器监听到"+servletContext+"被创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();
        System.out.println("该监听器监听到"+servletContext+"被销毁");
    }
}

4.ServletContextAttributeListener
ServletContextAttributeListener用于监听ServletContext的属性变化

public class HspServletContextAttributeListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("HspServletContextAttributeListener监听到添加属性"+servletContextAttributeEvent.getName()+"" +
                "="+servletContextAttributeEvent.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("HspServletContextAttributeListener监听到删除属性"+servletContextAttributeEvent.getName()+"" +
                "="+servletContextAttributeEvent.getValue());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("HspServletContextAttributeListener监听到替换属性"+servletContextAttributeEvent.getName()+"" +
                "="+servletContextAttributeEvent.getValue());
    }
}

5.HttpSessionListener
HttpSessionListener即生命周期监听,用于监听用户的上线或者离线

public class HspServletSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        HttpSession session = httpSessionEvent.getSession();
       session.setMaxInactiveInterval(20);//设置session生命周期
        System.out.println("HspServletSessionListener监听到了session的创建id为"+session.getId());
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        HttpSession session = httpSessionEvent.getSession();
        System.out.println("HspServletSessionListener监听到了session的销毁:"+session.getId());
    }
}

6.HttpSessionAttributeListener 用于监听session属性的变化
7.ServletRequestListener监听器用于监听Request创建或者销毁,即Request生命周期监听,也是监控某个ip访问网站的频率,记录访问日志
8.ServletRequestAttributeListener监听器用于监听request属性变化

二.过滤器

1.过滤器是JavaEE的规范,是接口.作用是拦截请求,过滤响应基本原理如下

在这里插入图片描述
请求转发方式不会经过过滤器
当客户端发送一个请求到 Tomcat 服务器时,请求会先经过 Filter 的 doFilter 方法进行预处理。在 doFilter 方法中,可以对请求进行修改,如设置字符编码、验证用户权限等。然后调用 FilterChain 的 doFilter 方法将请求传递给下一个 Filter 或 Servlet 进行处理。当 Servlet 处理完请求并生成响应后,响应会再次经过 Filter 的 doFilter 方法进行后处理,最后返回给客户端。

public class ManageFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //当Tomcat创建Filter实例后,就会调用filter的无参构造器,调用该nint方法进行初始化.
        System.out.println( "ManageFilter init方法被调用");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //当每次调用该filter时,就会调用该方法
        System.out.println("doFilter被调用");
        //继续访问目标资源,在调用过滤器前,servletRequest对象=request已经被创建并且封装
        //所以就可以通过servletRequest获取很多信息,比如访问url,session
        //获取session
        HttpSession session = ((HttpServletRequest) servletRequest).getSession();
        if(session.getAttribute("username")!=null){
            //下面这个语句相当于放行
            filterChain.doFilter(servletRequest,servletResponse);
        }else {//没有登陆过,回到登录页面\
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
        }
    }
    @Override
    public void destroy() {
//每次销毁filter时,就会调用该方法
        System.out.println("ManageFilter被销毁");
    }
}

2.Filter生命周期
当Tomcat创建Filter实例(只会创建一个,并且常驻内存)后,就会调用filter的无参构造器,调用该nint方法进行初始化.同时tomcat创建一个FilterConfig对象同时通过init方法传入
当一个http请求和该filter的url-patter匹配时,就会调用doFilter方法,同时会创建servletRequest,servletResponse,filterChain,通过doFilter传入,后面的请求资源若使用到requst和response,则是同一个会继续传递使用.停止web工程,销毁Filter就是调用destory

3.FilterConfig
FilterConfig是Filter过滤器的配置类,Tomcat每次创建Filter的时候,也会创建一个FilteConfig对象,这里包含了filter配置文件的配置信息

!--配置的参数,由程序员自己设计-->
        <init-param>
            <param-name>ip</param-name>
            <param-value>127.0</param-value>
        </init-param>
        <init-param>
            <param-name>port</param-name>
            <param-value>8888</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>HspFilterConfig</filter-name>
        <url-pattern>/abc/*</url-pattern>
    </filter-mapping>
public class HspFilterConfig implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //通过filterConfig获取相关的参数
        //获取filter的名字,ip
        String filterName = filterConfig.getFilterName();
        String ip = filterConfig.getInitParameter("ip");
        ServletContext servletContext = filterConfig.getServletContext();
        //可以获取到该Filter所有的配置参数名
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
        //遍历枚举
        while(initParameterNames.hasMoreElements()){
            System.out.println("名字是:"+initParameterNames.hasMoreElements());
        }
        System.out.println("fileName="+filterName);
        System.out.println("ip="+ip);
        System.out.println("servletContext="+servletContext)
    }
}

4.过滤器链
流程图:
在这里插入图片描述
注意事项:
在这里插入图片描述


http://www.kler.cn/a/538205.html

相关文章:

  • 分析模式应用――帐务模式02
  • Windows 本地部署大模型 OpenWebUI+Ollama
  • 模型压缩 --学习记录2
  • w~Transformer~合集5
  • OpenCV:视频背景减除
  • AI知识库和全文检索的区别
  • 【真一键部署脚本】——一键部署deepseek
  • 【练习】PAT 乙 1046 划拳
  • 【如何掌握CSP-J 信奥赛中的深搜算法】
  • 索引失效的14种常见场景
  • YONBIP后端环境搭建-IDEA
  • 3D数字化营销:重塑家居电商新生态
  • 对极几何方法——2D图片特征点估计运动
  • DeepSeek大模型本地部署实战
  • 【数据结构中链表常用的方法实现过程】
  • python基于深度学习的中文情感分析系统
  • AI安全最佳实践:AI应用开发安全评估矩阵(上)
  • Spring Boot:简化 Java 开发的利器
  • 24.ppt:小李-图书策划方案【1】
  • 通过C变成语言实现一个或多个算法
  • Redis数据库篇 -- Pipeline
  • 【0404】Postgres内核 实现分配一个新的 Object ID (OID)
  • Python如何实现名称为”000-“~“999-”文件的自动生成,且后缀名可以自定义
  • 基于SeaTunnel同步数据
  • 使用Jenkins实现鸿蒙HAR应用的自动化构建打包
  • COBOL语言的云计算