当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2023-01-30
目录 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简介
    • 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包下的

        @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 监听器的使用

        @WebListener
        public 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…”);

        }

        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("contextDestroyed....");
        }
        

        }

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

        ![image-20220916172910166](https://img-blog.csdnimg.cn/img_convert/7d4ee33099f9d23fddadcfc5140ab6f4.png)

        到此这篇关于Java Web开发中过滤器和监听器使用详解的文章就介绍到这了,更多相关JavaWeb过滤器和监听器内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

        上一篇:详解Java设计模式之桥接模式
        下一篇:没有了
        网友评论