写点什么

【JavaWeb】过滤器和监听器,就这?

作者:游坦之
  • 2022-10-29
    山东
  • 本文字数:2361 字

    阅读完需:约 8 分钟

【JavaWeb】过滤器和监听器,就这?

1 Filter

1.1 Filter 简介

  • Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

  • 过滤器可以把资源的请求拦截下来,从而实现一些特殊的功能。

  • 过滤器一般完成一些通用的操作,比如权限控制、统一编码处理、敏感字符处理等等

  • Filter 流程图


1.2 Filter 的快速入门

Filter 和 Servlet 很相像,步骤也是一样的。

1.2.1 创建 Filter 类

  1. 新建一个 Filter.java 文件,实现 Filter 接口

  2. 实现接口后,重写其三个方法

  3. 其中都 chain.doFilter()是放行的方法

  4. inti、和 destory 都是生命周期的函数

  5. @WebFilter()配置的是拦截的路径,当访问这个路径的时候,Filter 会被调用


注意:此处导入的 Filter 是 Javax Servlet 包下的


@WebFilter("/index.jsp")public class DemoFilter01 implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("1.init.......");    }
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("2.放行前....."); chain.doFilter(request,response); System.out.println("4.放行后....."); }
@Override public void destroy() { System.out.println("5.destory...."); }}
复制代码

1.2.2 访问 index.jsp

由上图分析所致,当我们访问 index.jsp 的时候,会调用 Filter,那么我们用代码检验一下上面的流程图。


**按照流程图,正确的输出应该是 1、2、3、4、5,**访问一下 index.jsp


<html><body><h2>Hello World!</h2><%    System.out.println("3. 我是index.jsp ......");%>
</body>
</html>
复制代码


结果证明流程图是正确的!




1、放行后访问对应资源,资源访问完成后,还会回到 Filter 吗?


2、如果回到 Filter 中,是重头执行还是执行放行后的逻辑呢?

放行后的逻辑

1.3 Filter 的拦截路径的配置

配置在**@WebFilter("")**中,主要有以下四类


  • 拦截具体的资源路径:/index.jsp,只有访问 index.jsp 的时候才会被拦截

  • 目录拦截:/user/*,访问/user 下的所有资源,都会被拦截

  • 后缀名拦截:*.jsp 访问后缀名为 jsp 的资源,都会被拦截

  • 拦截所有:/* 访问所有的资源,都会被拦截

1.4 过滤器链

1.4.1 过滤器链简介

一个 web 路径,可以配置多个过滤器,这多个过滤器就被称为过滤器链。


流程图如下:



见图知意:


当 web 应用有一个 A 一个 B 过滤器组成的过滤器链时,A 放行后,会来到 B 过滤器。只有两个过滤器都放行,才会访问到相应的资源。随后,按照怎么来的,怎么返回的方式,执行 B、A 的放行后逻辑


注意:


为什么是按照 A、B,而不是 B、A 呢?

你以为我瞎说的?其实不然,**排序方式即为按照字符串排序,**先后执行。就是字符串排序小的限制性。

1.4.2 过滤器链的例子

由上面的流程图可知,浏览器会按照 DemoFilter01 DemoFilter02 的方式 访问过滤器链,所以我们配置了两个过滤器类。


@WebFilter("/index.jsp")public class DemoFilter01 implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("DemoFilter01 init.......");    }
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("1.DemoFilter01 doFilter....."); chain.doFilter(request,response); System.out.println("5.DemoFilter01 doFilter end....."); }
@Override public void destroy() { System.out.println("DemoFilter01 destory...."); }}
复制代码


@WebFilter("/index.jsp")public class DemoFilter02 implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("DemoFilter02 init......");    }
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("2.DemoFilter02 doFilter...."); chain.doFilter(request,response); System.out.println("4.DemoFilter02 doFilter end...."); }
@Override public void destroy() { System.out.println("DemoFilter02 destory....."); }}
复制代码


<html><body><h2>Hello World!</h2><%    System.out.println("3. index.jsp ......");%>
</body>
</html>
复制代码


效果图如下:


2 Listener

2.1 概念

  • Listener 表示监听器,是 JavaWeb 三大组件之一。

  • 监听器可以监听就是在 application,session,request 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

  • Listener 分类:Javaweb 提供了 8 个监听器(接口)


2.2 监听器的使用

@WebListenerpublic class DemoListener01 implements ServletContextListener {    @Override    public void contextInitialized(ServletContextEvent sce) {        System.out.println("contextInitialized....");    }
@Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("contextDestroyed...."); }}
复制代码


当启动 Tomcat 的时候,会自动调用!


ntln("contextInitialized....");}


@Overridepublic void contextDestroyed(ServletContextEvent sce) {    System.out.println("contextDestroyed....");}
复制代码


}



当启动Tomcat的时候,会自动调用!
![image-20220916172910166](https://img-blog.csdnimg.cn/img_convert/7d4ee33099f9d23fddadcfc5140ab6f4.png)
复制代码


用户头像

游坦之

关注

还未添加个人签名 2022-10-14 加入

还未添加个人简介

评论

发布
暂无评论
【JavaWeb】过滤器和监听器,就这?_10月月更_游坦之_InfoQ写作社区