​Filter&Listener(过滤器和监听器)

2024年 1月 21日 66.1k 0

1、什么是Filter

  • 概念:Filter 表示过滤器,是 JavaWeb 三大组件(Servlet(主要)、Filter(辅助)、Listener(辅助))之一。
  • 作用:过滤器可以把对资源的请求拦截下来,从而实现一些特殊的通用操作功能
    • 统一编码处理
    • VIP功能
    • 敏感字处理(例如:打游戏时候发的信息展示结果  我*你*)

图片[1]-​Filter&Listener(过滤器和监听器)-不念博客

2、Filter快速入门

1、首先创建一个filter-listeren的web项目,然后在项目中添加一个servlet(充当web资源)

@WebServlet(value = "/demo")
public class Demo1Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo1请求");

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
    }
}

2、 定义类,实现 Filter接口,并重写其所有方法,配置Filter拦截资源的路径:在类上定义 @WebFilter 注解

/**
 * WebFilter    表示定义一个过滤器
 *  /*          表示对所有发送的请求进行拦截
 */
@WebFilter("/*")
public class Demo1filter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    }

    @Override
    public void destroy() {

    }
}

3、在doFilter方法中输出一句话,并放行

/**
     * 过滤器中的过滤方法
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    //放行前代码
    System.out.println("demo1放行前代码");

    //放行
    filterChain.doFilter(servletRequest,servletResponse);

    //放行后代码
    System.out.println("demo1放行后代码");
}

3、Filter执行流程

通过快速入门的结果我们发现Filter的执行流如下:

图片[2]-​Filter&Listener(过滤器和监听器)-不念博客

从中可以发现规律:

1.访问web资源的时候首先会经过过滤器执行放行前代码

  • 然后再访问web资源
  • 最后再返回到过滤器执行放行后代码
  • 思考:

    • 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?如果回到Filter中,是重头执行还是执行放行后的逻辑呢?
    • 如果回到Filter中,是重头执行还是执行放行后的逻辑呢?
    放行后逻辑

    4、Filter使用细节

    4.1、Filter 拦截路径配置

    疑问:浏览器访问目标资源的路径,如果目标地址不存在,过滤器会不会运行?

    如果请求的URL地址不存在,但是匹配过滤的地址,还是会执行过滤器

    Filter 可以根据需求,配置不同的拦截资源路径

    //@WebFilter(value = "/index.jsp")
    //@WebFilter(value = "/user/*")
    //@WebFilter(value = "*.jsp")
    @WebFilter(value = "/*")
    public class Demo1Filter implements Filter
    • 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截。
    • 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
    • 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
    • 拦截所有:/*:访问所有资源,都会被拦截

    4.2、过滤器链

    一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链

    图片[3]-​Filter&Listener(过滤器和监听器)-不念博客

    注:注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序

    4.3、XML配置Filter

    步骤:

    1.创建Filetr实现类

    public class Demo1filter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        /**
         * 过滤器中的过滤方法
         * @param servletRequest
         * @param servletResponse
         * @param filterChain
         * @throws IOException
         * @throws ServletException
         */
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            //放行前代码
            System.out.println("demo1放行前代码");
    
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
    
            //放行后代码
            System.out.println("demo1放行后代码");
        }
    
        @Override
        public void destroy() {
    
        }
    }

    2.配置Filter拦截资源的路径:在web.xml中配置

    <filter>
        <filter-name>demo1</filter-name>
        <filter-class>com.demo.filter.Demo1filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>demo1</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    发现XML配置的过滤器链,按照< filter-mapping>配置的先后顺序

    5、Listener

    • 概念:Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
    • 监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件
    • Listener分类:JavaWeb中提供了8个监听器

    图片[4]-​Filter&Listener(过滤器和监听器)-不念博客

    ServletContextListener 使用

  • 定义类,实现ServletContextListener接口
  • 在类上添加@WebListener 注解
  • @WebListener
    public class Demo1Listener implements ServletContextListener {
        /**
         * servletContext对象被创建,整个web应用发布成功
         * @param sce
         */
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("程序启动");//创建mysql连接池以及创建线程池
        }
        /**
         * servletContext对象销毁,整个web应用卸载
         * @param sce
         */
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("程序关闭");//关闭mysql连接池以及创建线程池
        }
    }

    启动程序结果

    图片[5]-​Filter&Listener(过滤器和监听器)-不念博客

    说明程序启动的时候调用了contextInitialized方法

    重启程序结果

    图片[6]-​Filter&Listener(过滤器和监听器)-不念博客

    说明程序关闭的时候调用了contextDestroyed方法

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论