- 发布日期
登录认证:Interceptor拦截器
- 作者
- 姓名
- 缘
- 社交账号
文章目录
Interceptor是什么
Interceptor 是 Spring 框架提供的动态拦截机制,主要拦截 Controller 方法的执行。
浏览器
↓
Interceptor
↓
Controller
常见用途包括登录认证、权限检查和公共逻辑处理。
定义Interceptor
@Component
public class DemoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler
) throws Exception {
return true;
}
@Override
public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView
) throws Exception {
System.out.println("postHandle...");
}
@Override
public void afterCompletion(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex
) throws Exception {
System.out.println("afterCompletion...");
}
}
三个核心方法
preHandle
在 Controller 方法执行之前调用。
返回 true 表示放行,返回 false 表示不放行。登录认证通常主要写在这里。
postHandle
目标 Controller 方法执行后调用。
afterCompletion
请求处理完成后调用,三个方法中最后执行。
注册Interceptor
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private DemoInterceptor demoInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor)
.addPathPatterns("/**");
}
}
JWT登录校验
Interceptor 中的 JWT 校验流程与 Filter 类似:
读取请求
↓
获取Token
↓
Token是否存在
↓
解析Token
↓
成功 → true
失败 → 401并false
登录接口可以直接在注册时排除:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
拦截路径
/*
只匹配一级路径:
/depts
/emps
/login
不能匹配 /depts/1。
/**
匹配任意级路径:
/depts
/depts/1
/depts/1/2
/depts/*
匹配 /depts 下一级路径,例如 /depts/1。
/depts/**
匹配 /depts 下任意级路径,例如:
/depts
/depts/1
/depts/1/2
执行流程
课程中的核心顺序:
preHandle
↓
Controller
↓
postHandle
↓
afterCompletion
preHandle 决定请求是否继续进入 Controller。
Filter与Interceptor的区别
Filter 实现:
Filter
Interceptor 实现:
HandlerInterceptor
所属体系:
Filter → Java Web / Servlet
Interceptor → Spring MVC
拦截范围上,课程强调:Filter 可以拦截 Web 应用中的各种资源,而 Interceptor 主要拦截 Spring 环境中的 Controller 资源。
整体位置可以理解为:
浏览器
↓
Filter
↓
Spring MVC
↓
Interceptor
↓
Controller
在登录认证中,两者都可以承担统一 Token 校验工作。