Filter(三)过滤器链

过滤器链:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链。

举个例子,如果有两个过滤器,那么在执行时,会先执行第一个过滤器放行前的逻辑,放行,然后再去执行第二个过滤器放行前的逻辑,第二个放行之后才能访问到资源,当资源访问完毕后,会先执行第二个过滤器放行后的逻辑,然后再去执行第一个过滤器放行后的逻辑。

 过滤器的执行顺序:注解配置的Filter,优先级时按照过滤器类名(字符串)的自然排序

当使用web.xml配置两个过滤器时,它们的执行顺序是按照它们在web.xml中定义的顺序来执行的。也就是说,如果一个请求需要经过第一个过滤器和第二个过滤器,那么Servlet容器将首先调用第一个过滤器,然后再调用第二个过滤器。

如果两个过滤器都需要对同一个请求进行处理,并且它们的执行顺序很重要,则可以使用元素中的dispatcher属性来指定过滤器的执行顺序。

<filter-mapping>
  <filter-name>myFilter1</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
</filter-mapping>

<filter-mapping>
  <filter-name>myFilter2</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>FORWARD</dispatcher>
</filter-mapping>

代码实现

过滤器1:

package com.fzb.Filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @author by FZB
 * @date 2023/7/20
 * 第一个过滤器
 * 注意:init 和 destroy方法在创建Filter对象时,默认执行
 */
//@WebFilter注解用于将一个类声明为Web过滤器(Filter)的组件。
@WebFilter(urlPatterns = "/*") // /*  代表拦截所有请求
public class Filter implements javax.servlet.Filter {
    //初始化算法,只调用一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init 初始化方法执行了");
    }

    //拦截到请求之后调用,调用多次
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截到了请求,过滤前执行");
        //放行 调用filterChain提供的方法放行
        //doFilter方法有两个参数,一个是Request对象,还有一个是Response对象
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("过滤后执行");
    }

    //销毁方法,在服务器关闭时执行,只调用一次
    @Override
    public void destroy() {
        System.out.println("destroy 销毁方法执行了");
    }
}

过滤器2:

package com.fzb.Filter;

import javax.servlet.*;
import javax.servlet.Filter;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @author by FZB
 * @date 2023/7/21
 * 第二个过滤器
 */
@WebFilter(urlPatterns = "/*")
public class TFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("TFilter放行前的逻辑");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("TFilter放行后的逻辑");
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

控制台打印结果

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值