温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

拦截器如何配置使用

发布时间:2026-08-30 04:46:39 来源:亿速云 阅读:87 作者:小樊 栏目:编程语言

“拦截器”在不同的框架里含义不同,最常见的有 Spring 拦截器(HandlerInterceptor) 和 MyBatis 拦截器(Interceptor)。下面我以 Spring Boot 拦截器 为主给你一个完整、可直接用的配置示例,最后再简单对比其他拦截器。


一、Spring Boot 拦截器(最常用)

1️⃣ 什么是拦截器

Spring 拦截器用于在 Controller 方法执行前后 进行统一处理,例如:

  • 登录校验
  • 权限校验
  • 日志记录
  • 接口耗时统计

注意:拦截器 只能拦截 Controller 请求,不能拦截静态资源(除非你配置)


2️⃣ 创建拦截器类

实现 HandlerInterceptor 接口:

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class LoginInterceptor implements HandlerInterceptor {

    // 在 Controller 方法执行前调用
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {

        String token = request.getHeader("token");
        if (token == null || token.isEmpty()) {
            response.setStatus(401);
            response.getWriter().write("未登录");
            return false; // 拦截
        }
        return true; // 放行
    }

    // Controller 执行后,视图渲染前
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           org.springframework.web.servlet.ModelAndView modelAndView) {
        // 可选
    }

    // 整个请求完成后
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception ex) {
        // 可选
    }
}

3️⃣ 注册拦截器(关键)

创建配置类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")      // 拦截路径
                .excludePathPatterns(        // 放行路径
                        "/login",
                        "/register",
                        "/error"
                );
    }
}

4️⃣ 执行顺序说明

preHandle → Controller → postHandle → afterCompletion

多个拦截器时:

preHandle1 → preHandle2 → Controller → postHandle2 → postHandle1

二、拦截器 vs 过滤器(很多人混淆)

对比项 拦截器 过滤器
所属 Spring Servlet
拦截范围 Controller 所有请求
是否依赖 Spring 是 否
使用场景 登录、权限 编码、跨域

三、MyBatis 拦截器(如果你问的是这个)

示例:SQL 日志拦截器

@Intercepts({
    @Signature(
        type = StatementHandler.class,
        method = "prepare",
        args = {Connection.class, Integer.class}
    )
})
@Component
public class MyBatisInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("SQL 执行前");
        return invocation.proceed();
    }
}

四、常见面试/实战问题

✅ 拦截器能拦截 static 资源吗?

默认不能,可通过配置解决

✅ 拦截器和 AOP 用哪个?

  • Controller 层 → 拦截器
  • Service 层 → AOP

如果你用的是 Spring Cloud / WebFlux / Struts / Vue 前端拦截器,告诉我具体场景,我可以直接给你对应框架的写法。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手