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");
}
}