javaweb(11) Listener监听器与Filter过滤器

javaweb(11) Listener监听器与Filter过滤器

Listener监听器

什么是Listener监听器

  • Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器
  • Listener 它是 JavaEE 的规范,就是接口
  • 监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

ServletContextListener监听器

  • ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。

  • ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。

  • 监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。

  • 两个方法:

    public void contextInitialized(ServletContextEvent sce);
    public void contextDestroyed(ServletContextEvent sce);
    
  • 如何使用ServletContextListener监听器监听ServletContext对象:

    1. 编写一个类去实现 ServletContextListener
    2. 实现其两个回调方法
    3. 到 web.xml 中去配置监听器

    监听器实现类:

    image-20200927153822093

    web.xml中的配置:

    image-20200927153858431

Filter过滤器

基本介绍

  1. Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
  2. Filter 过滤器它是 JavaEE 的规范。也就是接口
  3. Filter 过滤器它的作用是:拦截请求,过滤响应。

拦截请求的常见场景有:

  1. 权限检查
  2. 日记操作
  3. 事务管理等

Filter的基本使用

  • 要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必须是用户登录之后才允许访问。

具体步骤示例

  1. 创建一个类去实现filter接口,重写doFilter方法

    public class AdminFilter implements Filter {
          
          
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
          
          
            //专门用于拦截请求,过滤响应
            //权限检查
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            Object username = request.getSession().getAttribute("username");
            if (username == null){
          
          
                servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            }else {
          
          
                //让程序继续访问要访问的资源
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
    }
    
  2. 配置web.xml文件

    <!--filter标签用于配置一个filter过滤器-->
        <filter>
            <!--给filter起一个别名-->
            <filter-name>AdminFilter</filter-name>
            <!--配置filter的全类名-->
            <filter-class>com.deserts.filter.AdminFilter</filter-class>
        </filter>
        <!--配置filter的拦截路径-->
        <filter-mapping>
            <!--表示该拦截路径给哪个filter类使用-->
            <filter-name>AdminFilter</filter-name>
            <!--配置拦截路径-->
            <url-pattern>/admin/*</url-pattern>
        </filter-mapping>
    

完整流程描述

  • 当用户要访问过滤器filter所配置的资源路径时,会先经过实现了Filter接口的类AdminFilter,然后执行Filter进检查权限,如果用户名为空,转发到用户登录的页面;如果已登录,执行filterChain.doFilter(servletRequest, servletResponse);继续访问

image-20200929111248652

Filter的生命周期

image-20200929111445136

FilterConfig类

作用

  1. 获取 Filter 的名称 filter-name 的内容
  2. 获取在 Filter 中配置的 init-param 初始化参数
  3. 获取 ServletContext 对象

示例

image-20200929111630758

FilterChain过滤链

  • 在上述权限检查的过程中,当用户已登录,执行filterChain.doFilter(servletRequest, servletResponse)时,若有其它的Filter实现类同样配置了路径去拦截该资源,会继续执行下一个Filter类,多个Filter类都配置了要访问的资源路径时,执行顺序由web.xml从上到下的执行顺序决定。

image-20200929112616255

  • FilterChain.doFilter()方法的作用:
    1. 执行下一个filter过滤器(如果有)
    2. 执行目标资源(如果没有下一个过滤器)
  • 多个Filter执行的特点
    1. 所有filter和目标资源默认都执行在同一个线程中
    2. 多个filter共同执行的时候,它们都使用同一个filter对象

Filter的拦截路径

  1. 精确匹配

    image-20200929113150482

  2. 目录匹配

    image-20200929113218543

  3. 后缀名匹配

    image-20200929113252995

猜你喜欢

转载自blog.csdn.net/weixin_45834777/article/details/109080877