过滤器(Filter)笔记

1.过滤器概述

过滤器工作的位置

2.过滤器生命周期

package com.pac.servlet.filters;

import jakarta.servlet.*;

import java.io.IOException;

public class LifeCycleFilter implements Filter {

    /**
     * 生命周期
     * 1.构造      构造器     项目启动    1次
     * 2.初始化     init     构造完毕    1次
     * 3.过滤      doFilter  每次请求   多次
     * 4.销毁      destory   服务关闭   1次
     */
    public  LifeCycleFilter()  {
        System.out.println("构造1");
    }
    //通过tomcat读取配置文件然后生成这个Config对象,读取对应的配置信息
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(
                "初始化2"
        );

        System.out.println(filterConfig.getInitParameter("dataTimePattern"));
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤方法3");

        filterChain.doFilter(servletRequest, servletResponse);

    }

    @Override
    public void destroy() {
        System.out.println("销毁方法4");
    }
}

3.过滤器链的使用

请求不同的资源会经过不同的数量的过滤器

接下来测试经过过滤器的先后顺序

我们创建三个代码一样的filter:

代码如下:(filter1 2 3,只是改变了数字)

package com.pac.servlet.filters;

import jakarta.servlet.*;

import java.io.IOException;

public class Filter1 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter1 before doFilter invoked");

        filterChain.doFilter(servletRequest, servletResponse);

        System.out.println("filter1 after doFilter invoked");
    }
}

其运行结果如下

由此我们可以得出一个结论,经过flter然后返回的顺序是相互反着来的,其行走的顺序和在web.xml中配置的先后有关,由<filter-mapping>决定顺序

4.注解方式配置过滤器

同样的,filter可以通过注解的方式进行配置

@WebFilter("/*")

只需要在类名上面加一个这样的注解就可以了,通过注解的方式的话执行的顺序和类名字有关,通过类名的字符排序顺序执行

我们观察一下注解方式配置过滤器的源码都有些什么参数可以网上写

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package jakarta.servlet.annotation;

import jakarta.servlet.DispatcherType;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebFilter {
    String description() default "";

    String displayName() default "";

    WebInitParam[] initParams() default {};

    String filterName() default "";

    String smallIcon() default "";

    String largeIcon() default "";

    String[] servletNames() default {};

    String[] value() default {};

    String[] urlPatterns() default {};

    DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};

    boolean asyncSupported() default false;
}

通过注解我们可以这样配置过滤器

package com.pac.servlet.filters;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.annotation.WebInitParam;

import java.io.IOException;
@WebFilter(
        filterName = "Filter1",
        initParams = {@WebInitParam(name = "keyName",value = "value")},
        urlPatterns = {"/ServletA","*.html"} //过滤项目资源的路径
        ,servletNames = {"ServletBName"}//过滤的多个servlet的别名
)
public class Filter1 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter1 before doFilter invoked");

        filterChain.doFilter(servletRequest, servletResponse);

        System.out.println("filter1 after doFilter invoked");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值