zoukankan      html  css  js  c++  java
  • java之 Filter&Listener

    0x01、Filter

    什么是filter

    ​ Filter:一个实现了特殊接口(Filter)的Java类. 实现对请求资源(jsp,servlet,html,)的过滤的功能.

    ​ 过滤器是一个运行在服务器的程序, 优先于请求资源(Servlet或者jsp,html)之前执行. 过滤器是javaweb技术中最为实用的技术之一.

    ​ 对目标资源(Servlet,jsp)进行过滤.

    ​ 应用场景:登录权限检查,解决网站乱码,过滤敏感字符 ...

    1、配置文件方式

    <filter>
      <!--filter-name:filter名字 随便取的(一般用类名, 不要重复)-->
      <filter-name>FilterDemo01</filter-name>
      <!--filter-class:filier类的全限定名-->
      <filter-class>com.itheima.day01.FilterDemo01</filter-class>
    </filter>
    
    <!--配置Filter拦截映射的路径-->
    <filter-mapping>
      <!--filter-name:必须和filter里面的filter-name一致-->
      <filter-name>FilterDemo01</filter-name>
      <!--url-pattern:匹配的路径-->
      <url-pattern>/demo01</url-pattern>
    </filter-mapping>
    

    2、注解方式

    • 创建一个类实现Filter接口
    • 直接在这个类上面添加注解进行配置

    image-20210126193531832

    3、Filter生命周期

    	init(FilterConfig):初始化     
    
    ​	doFilter(ServletReqeust req,ServletResponse resp,FilterChain chain):执行过滤的方法  
    
    ​	destroy():销毁
    
    1. 服务器启动的时候, 会调用init()方法进行初始化【调用一次】
    2. 任何一次请求都会调用doFilter()方法进行过滤【路径相匹配】
    3. 服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁【调用一次】

    注意: 默认情况下,Servlet是来了第一次请求的时候 调用init()方法进行初始化.我们可以在Servlet里面设置启动项.

    1. 完全路径匹配
    /demo01
    
    1. 目录匹配
    /*  匹配所有的资源   /aa/* 匹配以/aa开头的资源
    
    1. 扩展名匹配
    *.jsp  匹配上了所有的jsp   *.html 匹配上了所有的html
    
    1. 缺省匹配 / 匹配除了jsp以为的所有的资源
    /   除了jsp 其它的都匹配
    
    /*  匹配所有
    

    4、拦截方式

    1. 通过dispatcherTypes配置拦截方式

      • DispatcherType.FORWARD: 【只】过滤转发

      • DispatcherType.REQUEST: 除了转发以为其它的都过滤(1.浏览器的直接请求 2.重定向)【默认值】

    2. 拦截方式的这个值,我们可以配置多个

    @WebFilter(value = {"/demo06"},dispatcherTypes={DispatcherType.FORWARD,DispatcherType.REQUEST})
    

    一般情况下, 转发我们不会过滤的. 转发属于服务器内部的行为. 直接使用默认值的情况偏多

    5、过滤链

    过滤器链执行顺序

    • 配置文件: 谁先配置filter-mapping 谁先执行
    • 注解方式: 按照Filter的首字母顺序 eg: AFilter BFilter A在B的前面, AFilter先执行

    0x02、Listener

    什么是Listener

    • 监听器就是一个Java类,用来监听其他的JavaBean对象的变化

    • 在javaweb中监听器就是监听三个域对象的状态的。request,session,servletContext(application)

    作用:

    • 主要在Swing编程

    • 在Android/ios大量应用

    • JS里面的事件

    监听器术语

    eg: 一个狗仔拍明星出轨
    
    ​	事件源 :被监听的对象.(目标对象)        明星 
    
     	监听器对象:监听的对象.               狗仔				
    
    ​	事件:事件源行为的称呼.         	   出轨		  	
    
    ​	注册(绑定):将"监听器"对象注册给"事件源".   狗仔需要和明星绑定(跟踪, 蹲点...)
    
    ​	事件对象:在"监听器对象"中获得"事件源"      狗仔的镜头里面获得明星出轨证据
    

    listener 监听器实现:

    首先我们需要实现ServletContextListener的接口,该接口并没有一个定义好的实现类,需要自己进行定义。

    ServletContextListener方法:

    void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
    
    void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
    

    代码:

    • 配置java代码
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    /**
     * 一、写一个类实现ServletContextListener接口,并重写方法
     * 方法1: contextInitialized()会在ServletContext对象创建的时候执行,也就是在服务器启动的时候
     * 方法2: contextDestroyed()会在ServletContext对象销毁的时候执行,也就是在服务器关闭的时候
     *
     * 二、在web.xml中配置监听器
     */
    public class MyContextListener implements ServletContextListener{
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("监听到了服务器的启动....创建spring的核心容器");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("监听到了服务器的关闭....销毁spring的核心容器");
        }
    }
    
    • 配置(web.xml)
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <listener>
            <listener-class>com.itheima.listener.MyContextListener</listener-class>
        </listener>
    </web-app>
    

    应用: Spring框架里面, 服务器启动时候, 就加载Spring框架 初始化

  • 相关阅读:
    YTU 2625: B 构造函数和析构函数
    YTU 2623: B 抽象类-形状
    YTU 2622: B 虚拟继承(虚基类)-沙发床(改错题)
    YTU 2621: B 继承 圆到圆柱体
    YTU 2620: B 链表操作
    YTU 2619: B 友元类-计算两点间距离
    刷题总结——切蛋糕(ssoj)
    刷题总结——拦截导弹(ssoj)
    算法复习——费用流模板(poj2135)
    算法复习——网络流模板(ssoj)
  • 原文地址:https://www.cnblogs.com/0x7e/p/14332133.html
Copyright © 2011-2022 走看看