缘博客
发布日期

登录认证: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 校验工作。