目录
执行流程
- 过滤器Filter拦截到请求之后,首先执行方放行之前的逻辑,然后执行放行操作(doFilter),然后会访问对应的Web资源(对应的Controller类),Controller类处理完请求后,然后执行放行之后的逻辑,最后将响应结果返回给前端。
拦截路径
- Filter可以根据需求,匹配不同的拦截资源路径
-
拦截路径 urlPatterns值 含义
拦截具体路径 /login 只有访问/login路径时,才会被拦截 目录拦截 /emps/* 访问/emps下的所有资源,都会被拦截 拦截所有 /* 访问所有资源,都会被拦截
-
过滤器链
- 介绍:一个Web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链
- 在所有过滤器放行之后才会访问Web资源(Controller类),而过滤器放行之后的逻辑的执行顺序是从后到前的。最后给前端响应数据
- 具体举例如下:
- 过滤器Filter顺序:
-
具体代码如下:
-
AFilter
-
package com.example.tlias.Filter; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(urlPatterns = "/*") public class AFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("AFilter放行之前的逻辑"); // todo 放行请求,让其访问对应的资源 filterChain.doFilter(servletRequest, servletResponse); System.out.println("AFilter放行之后的逻辑"); } }
-
JWTFIlter
-
package com.example.tlias.Filter; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") // todo 设置当前过滤器要拦截的请求 public class JWTFilter implements Filter { @Override// todo 初始化方法,Web服务器启动时,创建Filter时调用,只调用一次 public void init(FilterConfig filterConfig) throws ServletException { Filter.super.init(filterConfig); System.out.println("init初始化方法执行了"); } @Override // todo 拦截到请求时就会调用该方法,可调用多次 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("JWTFilter放行之前的逻辑"); // todo 放行请求,让其访问对应的资源 filterChain.doFilter(servletRequest, servletResponse); System.out.println("JWTFilter放行之后的逻辑"); } @Override // todo 销毁方法,服务器关闭时调用,只调用一次 public void destroy() { Filter.super.destroy(); System.out.println("destroy销毁方法执行了"); } }
-
-
测试运行结果
-
- 在所有的过滤器放行前的逻辑执行完之后,才会将请求交给Web资源进行处理
-
- 过滤器Filter顺序:
小结
- 执行流程
- 请求-->放行前的流程-->放行-->资源-->放行后的逻辑
- 拦截路径
- /login
- /depts/*
- /*
- 过滤器链
- 一个Web应用中,配置多个过滤器,就形成一个过滤器链