本文介绍了Filter过滤器的作用、用途、以及它的设计模式。同时也介绍了两种Listener监听器 一、Filter过滤器1.1 Filter过滤器的使用 这是过滤器接口的方法 public interface Filter { default void
- 这是过滤器接口的方法
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
- 一般情况下我们都在过滤器中添加公共的代码
- 例如我们经常设置字符编码utf-8,为了减少重复的操作,我们直接在过滤器中设置即可。
@WebFilter("/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//在Filter对象第一次被创建的时候调用,并且只调用一次
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//doFilter()只要用户发送一次请求,则执行一次,发送N次,则执行N次。在这个方法中编写过滤规则
System.out.println("doFilter方法,前1");
//解决跨域问题
HttpServletResponse resp = (HttpServletResponse) servletResponse;
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Headers", "*");
resp.setHeader("Access-Control-Allow-Method", "*");
//执行下一个过滤器,如果说下一个不是过滤器,则会执行servlet
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("doFilter方法,后1");
}
@Override
public void destroy() {
//在Filter对象被释放/销毁之前调用,并且只调用一次
System.out.println("destroy方法");
}
}
-
init方法:在Filter对象第一次被创建的时候调用,并且只调用一次
-
doFilter方法:只要用户发送一次请求,则执行一次,发送N次,则执行N次。在这个方法中编写过滤规则
-
destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次
-
filterChain.doFilter(request, response);
执行下一个过滤器,如果下一个不是过滤器,则执行Servlet
目标Servlet是否执行取决于两个条件:
- 过滤器中是否编写了
filterChain.doFilter(request, response);
- 用户发的请求路径是否和Servlet的请求路径一致
注意:
- Filter的优先级天生就比Servlet高
- 使用@WebFilter的时候,Filter执行顺序根据类名顺序执行。
- Filter的生命周期与Servlet一样,但是Filter会在服务器启动的时候就默认创建对象,而Servlet却需要配置才可以。
- 如果在web.xml中配置两个或者多个过滤器时,执行顺序根据
<filter-mapping>
的先后。
- 我们先来看一下两个过滤器的运行过程是什么样的
- Filter过滤器的doFilter方法,执行顺序遵循的是栈结构,但是过滤器本身的生命周期就和队列差不多吧。
- 其实doFilter方法,就是一种责任链设计模式!
//模仿栈
//模仿Filter设计模式
//缺点:在编译阶段已经完全确定了调用关系
//如果想要改变调用顺序,必须要修改java代码
//违背了OCP原则(开闭原则)
public class Test {
public static void main(String[] args) {
System.out.println("main方法执行");
m1();
System.out.println("main执行完毕");
}
public static void m1() {
System.out.println("m1方法执行");
m2();
System.out.println("m1执行完毕");
}
public static void m2() {
System.out.println("m2方法执行");
m3();
System.out.println("m2执行完毕");
}
public static void m3() {
System.out.println("目标正在执行中");
}
}
- 这是执行的结果,是不是和Filter一样~~~