- 发布日期
登录认证: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 校验逻辑。