缘博客
发布日期

登录认证:Filter过滤器与JWT校验

作者
  • 姓名
    社交账号

Filter是什么

Filter 是 Java Web 三大组件之一:Servlet、Filter、Listener。

Filter 可以在请求真正访问目标资源之前进行统一处理:

浏览器
 Filter
Controller

常见用途包括登录校验、统一编码和敏感字符处理。


Filter快速入门

@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init ...");
    }

    @Override
    public void doFilter(
            ServletRequest request,
            ServletResponse response,
            FilterChain chain
    ) throws IOException, ServletException {
        System.out.println("拦截到了请求...");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("destroy ...");
    }
}

启动类上需要:

@ServletComponentScan
@SpringBootApplication
public class TliasManagementApplication {
}

Filter生命周期

  • init():Web 服务器启动、创建 Filter 实例时调用一次。
  • doFilter():每次拦截到匹配请求时调用。
  • destroy():Web 服务器关闭时调用一次。

如果希望请求继续访问目标资源,必须执行:

chain.doFilter(request, response);

否则请求会停在过滤器中。


JWT登录校验Filter

课程中的校验流程:

获取请求URL
是否登录请求?
   ├─ 是 → 放行
   ↓ 否
获取请求头Token
Token是否存在?
   ├─ 否 → 401
   ↓ 是
解析Token
解析成功?
   ├─ 否 → 401
   ↓ 是
放行

登录接口 /login 必须排除,否则用户还没拿到 Token 就会被拦截。


Filter执行流程

chain.doFilter(...) 执行目标资源后,还会回到 Filter 继续执行放行后的逻辑。

System.out.println("放行前");
chain.doFilter(request, response);
System.out.println("放行后");

顺序:

放行前
→ 放行
→ 目标资源
→ 放行后

Filter拦截路径

具体路径

/login

只拦截 /login

目录拦截

/emps/*

拦截 /emps 下的资源。

拦截所有

/*

拦截所有 Web 请求。

登录校验通常先拦截全部,再在过滤器内部排除登录请求。


过滤器链

一个 Web 应用可以配置多个 Filter,它们共同形成过滤器链。

请求
Filter1 放行前
Filter2 放行前
资源
Filter2 放行后
Filter1 放行后
响应

课程中指出,使用注解配置多个 Filter 时,顺序按照过滤器类名字符串的自然顺序确定。


Filter在认证链路中的位置

浏览器
  ↓ 请求 + Token
JWT认证Filter
合法?
 ├─ 否 → 401
 ↓ 是
Controller
Service
Mapper

这样业务 Controller 不需要重复编写 Token 校验逻辑。