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

简介: Java中的过滤器(Filter)和监听器(Listener)是两种不同的概念。过滤器(Filter)是在Java Web应用程序中,用来拦截和修改进入或离开web应用程序的请求和响应的对象。监听器(Listener)是一种用于监听和响应特定事件的Java对象。

1、什么是Filter

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

image-20240121101601279

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的执行流如下:

image-20240121105418161

从中可以发现规律:

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

  1. 然后再访问web资源
  2. 最后再返回到过滤器执行放行后代码

思考:

  • 放行后访问对应资源,资源访问完成后,还会回到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应用,可以配置多个过滤器,这多个过滤器称为过滤器链

image-20221102204934232

:注解配置的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() {
   
   

    }
}
    1. 配置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个监听器

image-20221102214313741

ServletContextListener 使用

  1. 定义类,实现ServletContextListener接口

  2. 在类上添加@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连接池以及创建线程池
    }
}

启动程序结果

image-20221102214817872

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

重启程序结果

image-20221102214912961

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

相关文章
|
存储 监控 OLAP
【ClickHouse 技术系列】- 在 ClickHouse 物化视图中使用 Join
本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因其优良的查询性能,PB级的数据规模,简单的架构,被国内外公司广泛采用。本系列技术文章,将详细展开介绍 ClickHouse。
【ClickHouse 技术系列】- 在 ClickHouse 物化视图中使用 Join
|
10月前
|
缓存 前端开发 API
登录校验---Filter过滤器
Filter是JavaWeb三大组件之一,用于拦截请求并实现登录校验、编码处理等功能。通过`doFilter()`方法实现过滤逻辑,支持配置拦截路径与过滤器链。常用于JWT令牌验证、跨域处理等场景。
587 10
登录校验---Filter过滤器
|
8月前
|
Web App开发 前端开发 JavaScript
SpringBoot跨域处理
本文介绍了跨域(CORS)的产生原因及解决方案。当协议、域名、端口任一不同,即为跨域。浏览器因同源策略限制,默认阻止跨域请求。通过@CrossOrigin注解、全局配置WebMvcConfigurer或自定义Filter添加响应头,可实现跨域资源共享,允许指定外域访问资源,解决前端请求被阻问题。
|
JavaScript 前端开发 Android开发
JavaScript触摸touch事件
JavaScript触摸touch事件
|
安全 Java
使用FilterChain实现Java中的过滤器链
使用FilterChain实现Java中的过滤器链
|
JavaScript 前端开发
JS实现移动端的轮播图滑动事件
JS实现移动端的轮播图滑动事件
321 0
|
数据采集 JSON Serverless
通过百炼大模型+FC函数计算构建小红书图文工作流
使用阿里云函数服务和百炼平台,快速构建小红书图文创作工作流。通过两步轻松创建: 1) 在函数计算中利用Puppeteer构建卡片生成服务; 2) 在百炼平台上创建工作流,整合大模型、脚本和函数计算节点,实现图文内容的自动化处理和生成。此方案适合高效创作小红书内容。
2668 7
|
监控 Shell
在Shell脚本中实现进程监控
在Shell脚本中实现进程监控
1014 5
|
JavaScript Java 测试技术
基于Java的校园失物招领网站的设计与实现(源码+lw+部署文档+讲解等)
基于Java的校园失物招领网站的设计与实现(源码+lw+部署文档+讲解等)
155 1
|
SQL 安全 数据挖掘
隐私计算实训营第7讲:隐语SCQL的架构详细拆解丨隐私计算实训营 第1期
SCQL是安全协作查询语言,让不信任的多方能在保护隐私的前提下进行联合数据分析。它假设参与者半诚实,支持多方(N&gt;=2)合作,且具备SQL语法支持和性能优化。SCQL提供类似SQL的用户界面,通过CCL机制允许数据所有者控制数据使用权限。系统基于SPU的MPC框架运行,适用于多个应用场景。
727 0