本文章主要描述通过springboot的filter类,在过滤器中设置jwt信息进行身份信息保存的方法
流程:请求->过滤器->解析请求的body信息->放入threadlocal中
定义filter:一个使用 Servlet 规范的过滤器(Filter),它通过 @WebFilter 注解注册为拦截所有匹配 /api 路径的 HTTP 请求。
@WebFilter(“/api”) 注解指定了过滤器将应用于所有访问 /api路径的请求。
@Component 注解:
@Component 是 Spring 框架的注解,表明 JwtFilter 是一个 Spring 组件,可以被 Spring 容器管理,并支持依赖注入。
doFilter方法:
doFilter 方法定义了过滤器如何拦截和处理进入 Servlet 或 Servlet 容器的请求和响应。
方法签名:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
这个方法接受三个参数:ServletRequest request、ServletResponse response 和 FilterChain chain。
它可能抛出 IOException 或 ServletException。
请求和响应:
doFilter 方法的前两个参数代表当前的请求和响应对象,你可以在这个方法中读取请求数据、修改请求和响应。
通常,在 doFilter 方法的最后,你需要调用 chain.doFilter(request, response) 来继续执行过滤器链中的下一个过滤器或目标资源。
如果要重新修改请求内容,可以用HttpServletRequestWrapper,HttpServletRequestWrapper 是一个包装器类,它扩展了 HttpServletRequest 接口,允许你修改或扩展请求的处理。使用 HttpServletRequestUriWrapper(这可能是一个自定义的包装器类,继承自 HttpServletRequestWrapper)的目的通常包括:
修改请求 URI:
你可能想要修改请求的 URI,但不想改变原始的 HttpServletRequest 对象。通过使用 HttpServletRequestUriWrapper,你可以包装原始请求并提供一个修改后的 URI。
保持原始请求不变:
使用包装器可以保持原始请求对象不变,同时允许你在过滤链中的某个点修改请求的某些方面。
过滤和预处理:
在调用 filterChain.doFilter 之前,你可以在 doFilter 方法中添加任何预处理逻辑,例如修改请求参数、更改请求路径、添加或修改请求头等。
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
@WebFilter("/api")
@Component
@Slf4j
public class JwtFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
// noting to do
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
var httpRequest = (HttpServletRequest