[JAVA] Java Web开发中过滤器和监听器使用详解

1642 0
黑夜隐士 2022-11-8 18:09:12 | 显示全部楼层 |阅读模式
目录

    1 Filter
      1.1 Filter简介1.2 Filter的快速入门
        1.2.1 创建Filter类1.2.2 访问index.jsp
      1.3 Filter的拦截路径的配置1.4 过滤器链
        1.4.1 过滤器链简介1.4.2 过滤器链的例子

    2 Listener
      2.1 概念2.2 监听器的使用



1 Filter


1.1 Filter简介

    Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把资源的请求拦截下来,从而实现一些特殊的功能。过滤器一般完成一些通用的操作,比如权限控制、统一编码处理、敏感字符处理等等Filter流程图



1.2 Filter的快速入门

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

1.2.1 创建Filter类

    新建一个Filter.java文件,实现Filter接口实现接口后,重写其三个方法其中都chain.doFilter()是放行的方法inti、和destory都是生命周期的函数@WebFilter()配置的是拦截的路径,当访问这个路径的时候,Filter会被调用
注意:此处导入的Filter 是Javax Servlet包下的
  1. @WebFilter("/index.jsp")
  2. public class DemoFilter01 implements Filter {
  3.     @Override
  4.     public void init(FilterConfig filterConfig) throws ServletException {
  5.         System.out.println("1.init.......");
  6.     }
  7.     @Override
  8.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  9.         System.out.println("2.放行前.....");
  10.         chain.doFilter(request,response);
  11.         System.out.println("4.放行后.....");
  12.     }
  13.     @Override
  14.     public void destroy() {
  15.         System.out.println("5.destory....");
  16.     }
  17. }
复制代码
1.2.2 访问index.jsp

由上图分析所致,当我们访问index.jsp的时候,会调用Filter,那么我们用代码检验一下上面的流程图。
**按照流程图,正确的输出应该是1、2、3、4、5,**访问一下index.jsp
  1. <html>
  2. <body>
  3. <h2>Hello World!</h2>
  4. <%
  5.     System.out.println("3. 我是index.jsp ......");
  6. %>
  7. </body>
  8. </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 的方式 访问过滤器链,所以我们配置了两个过滤器类。
  1. @WebFilter("/index.jsp")
  2. public class DemoFilter01 implements Filter {
  3.     @Override
  4.     public void init(FilterConfig filterConfig) throws ServletException {
  5.         System.out.println("DemoFilter01 init.......");
  6.     }
  7.     @Override
  8.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  9.         System.out.println("1.DemoFilter01 doFilter.....");
  10.         chain.doFilter(request,response);
  11.         System.out.println("5.DemoFilter01 doFilter end.....");
  12.     }
  13.     @Override
  14.     public void destroy() {
  15.         System.out.println("DemoFilter01 destory....");
  16.     }
  17. }
复制代码
  1. @WebFilter("/index.jsp")
  2. public class DemoFilter02 implements Filter {
  3.     @Override
  4.     public void init(FilterConfig filterConfig) throws ServletException {
  5.         System.out.println("DemoFilter02 init......");
  6.     }
  7.     @Override
  8.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  9.         System.out.println("2.DemoFilter02 doFilter....");
  10.         chain.doFilter(request,response);
  11.         System.out.println("4.DemoFilter02 doFilter end....");
  12.     }
  13.     @Override
  14.     public void destroy() {
  15.         System.out.println("DemoFilter02 destory.....");
  16.     }
  17. }
复制代码
  1. <html>
  2. <body>
  3. <h2>Hello World!</h2>
  4. <%
  5.     System.out.println("3. index.jsp ......");
  6. %>
  7. </body>
  8. </html>
复制代码
效果图如下:



2 Listener


2.1 概念

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



2.2 监听器的使用
  1. @WebListener
  2. public class DemoListener01 implements ServletContextListener {
  3.     @Override
  4.     public void contextInitialized(ServletContextEvent sce) {
  5.         System.out.println("contextInitialized....");
  6.     }
  7.     @Override
  8.     public void contextDestroyed(ServletContextEvent sce) {
  9.         System.out.println("contextDestroyed....");
  10.     }
  11. }
复制代码
当启动Tomcat的时候,会自动调用!
ntln(“contextInitialized…”);
}
  1. @Override
  2. public void contextDestroyed(ServletContextEvent sce) {
  3.     System.out.println("contextDestroyed....");
  4. }
复制代码
}
当启动Tomcat的时候,会自动调用!
![image-20220916172910166](https://img-blog.csdnimg.cn/img_convert/7d4ee33099f9d23fddadcfc5140ab6f4.png)
到此这篇关于Java Web开发中过滤器和监听器使用详解的文章就介绍到这了,更多相关JavaWeb过滤器和监听器内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持中国红客联盟!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行