• Filter、Listener学习笔记


    java web的三大组件:

    • Filter:过滤器
    • Listener:监听器
    • Servlet

    Filter

    过滤器是处于客户端与服务器资源文件之间的一道过滤网,当访问服务器资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

    过滤器的作用

    用于完成通用的操作。如:登陆验证、统一编码处理、敏感字符过滤...便于代码重用,不必每个servlet中还要进行相应的操作。

    步骤

    1. 定义一个类,实现接口Filter

    2. 重写方法

    3. 配置拦截路径

      1. 注解
      import javax.servlet.*;//Filter包不要导错
      import javax.servlet.annotation.WebFilter;
      import java.io.IOException;
      
      @WebFilter("/*")//拦截所有请求
      public class FilterDemo implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
      
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              System.out.println("过滤器执行了");
              filterChain.doFilter(servletRequest,servletResponse);//过滤器放行
          }
      
          @Override
          public void destroy() {
      
          }
      }
      
      1. web.xml

      在web.xml中,监听器 > 过滤器 > servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。

          <filter>
              <filter-name>demo1</filter-name><!--过滤器名称-->
              <filter-class>com.gs.loginFilter</filter-class><!--过滤器类的包路径-->
              <async-supported>true</async-supported><!--servlet 3.0后推出的新特性,支持异步处理。-->
              <init-param><!--可选-->
              <param-name>参数名</param-name><!--过滤器初始化参数-->
              <param-value>参数值</param-value>
              </init-param>
          </filter>
      
          <filter-mapping><!--过滤器映射-->
              <filter-name>loginFilter</filter-name>
                  <url-pattern>指定过滤器作用的对象</url-pattern>
          </filter-mapping>
      

    过滤器执行流程

    1. 执行过滤器
    2. 执行放行后的资源
    3. 执行过滤器放行代码后的代码

    过滤器生命周期

    1. init:服务器启动时,会创建Filter对象。然后调用init()方法,用于加载资源,只执行一次。
    2. doFilter:每次请求资源被拦截时,调用doFilter()方法。
    3. destroy:服务器关闭后,Filter对象被销毁,如果服务器正常关闭,执行destroy()方法,释放资源,只执行一次。

    拦截路径配置

    1. 具体资源路径:/index.jsp 访问index.jsp资源时,过滤器执行
    2. 拦截目录:/user/* 访问/user下的所有资源时,过滤器执行
    3. 后缀名拦截:*.jsp 访问所有jsp资源时,过滤器执行
    4. 拦截所有资源:/*

    拦截方式的配置

    设置dispatcherTypes属性

    1. REQUEST:默认值,浏览器直接请求访问资源

    2. FORWARD:转发访问资源

    3. INCLUDE:包含访问资源

    4. ERROR:错误跳转资源

    5. ASYNC:异步访问资源

      • 注解
      //浏览器直接请求访问index.jsp页面时,该过滤器执行。
      @WebFilter(value = "/index.jsp", dispatcherTypes = DispatcherType.REQUEST)
      
      //浏览器转发访问index.jsp页面时,该过滤器执行。
      @WebFilter(value = "/index.jsp", dispatcherTypes = DispatcherType.FORWARD)
      
      //浏览器直接请求访问index.jsp页面 或 转发访问index.jsp页面时,该过滤器执行。
      @WebFilter(value = "/index.jsp", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})
      
      • web.xml

        添加dispatcher标签,

      <filter-mapping><!--过滤器映射-->
          <filter-name>demo1</filter-name>
          <url-pattern>指定过滤器作用的对象</url-pattern>
          <dispatcher>REQUEST</dispatcher><!--FORWARD, INCLUDE, REQUEST, ASYNC, ERROR-->
      </filter-mapping>
      

    过滤器链

    配置多个过滤器

    1. 执行步骤

      假如有两个过滤器,A和B,A先执行,B后执行

      graph LR A执行-->B执行 B执行-->资源执行 资源执行-->B执行 B执行-->A执行
    2. 执行顺序

      • 注解配置:

        按照类名的字符串比较,字符串逐个字符比较大小,值小的先执行

      • web.xml配置:

        按照定义的先后顺序执行

    案例

    1. 登录验证

    需求

    1. 访问登陆案例的资源,验证其是否登录
    2. 如果登录,则直接放行
    3. 如果没有登陆,则跳转到登陆页面,提示“尚未登陆,请先登录”

    Listener

    概念:

    web三大组件之一

    事件监听机制

    • 事件:一件事情

    • 事件源:事件发生的地方

    • 监听器:一个对象

    • 注册监听:将事件、事件源、监听器绑定在一起,当事件源上发生某个时间后,执行监听代码。

    步骤

    1. 定义一个类,实现ServletContextListener接口

    2. 重写方法

    3. 配置

      1. web.xml

        <!--  配置监听器  -->
        <listener>
                <listener-class>com.java.listener.FirstListener</listener-class>
        </listener>
        <!--  配置初始化参数  -->
        <context-param>
            <param-name>initParam</param-name>
            <param-value>listener</param-value>
        </context-param>
        
      2. 注解

        @WebListener
        

    ServletContextListener

    监听ServletContext对象的创建和销毁

    方法:

    void contextInitialized(ServletContextEvent sce)//ServletContext对象创建后,会调用
    void contextDestroyed(ServletContextEvent sce)//ServletContext对象被销毁之前,会调用该方法
    
  • 相关阅读:
    Dockerfile 指令 VOLUME 介绍
    Spring boot(4)-应用打包部署
    Docker Dockerfile详解
    poj-1045(数学不好怪我咯)
    poj-3185-开关问题
    poj-1163-The Triangle
    归并排序(Merge Sort)
    交换排序—快速排序(Quick Sort)
    交换排序—冒泡排序(Bubble Sort)
    选择排序—堆排序(Heap Sort) 没看明白,不解释
  • 原文地址:https://www.cnblogs.com/fengxiaoqi/p/12857633.html
Copyright © 2020-2023  润新知