温馨提示×

温馨提示×

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

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

Spring拦截器怎么用

发布时间:2026-08-30 05:10:40 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

Spring(Spring MVC / Spring Boot) 中,拦截器(Interceptor) 用来在请求到达 Controller 之前 / 之后 / 完成时 做一些通用处理,比如:
登录校验、权限验证、日志记录、接口耗时统计等。


一、拦截器的作用位置

请求 → 拦截器 preHandle → Controller → 拦截器 postHandle → 视图渲染 → afterCompletion

✅ 和 过滤器(Filter) 不同,拦截器是 Spring MVC 层 的,能拿到 HandlerMethodModelAndView 等。


二、拦截器的三个方法

实现 HandlerInterceptor 接口(或继承 HandlerInterceptorAdapter):

public class MyInterceptor implements HandlerInterceptor {

    // 在 Controller 方法执行前调用
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("preHandle");
        return true; // true 放行,false 拦截
    }

    // Controller 执行后,视图渲染前
    @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");
    }
}

三、注册拦截器(关键步骤)

✅ Spring Boot 方式(推荐)

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/api/**")      // 拦截路径
                .excludePathPatterns("/api/login"); // 排除路径
    }
}

四、常见使用场景示例

1️⃣ 登录拦截

@Override
public boolean preHandle(HttpServletRequest request,
                        HttpServletResponse response,
                        Object handler) throws Exception {

    Object user = request.getSession().getAttribute("user");
    if (user == null) {
        response.sendRedirect("/login");
        return false;
    }
    return true;
}

2️⃣ 接口耗时统计

@Override
public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object handler) {
    request.setAttribute("startTime", System.currentTimeMillis());
    return true;
}

@Override
public void afterCompletion(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           Exception ex) {
    Long start = (Long) request.getAttribute("startTime");
    System.out.println("耗时:" + (System.currentTimeMillis() - start) + "ms");
}

3️⃣ 只拦截 Controller 方法(避免拦截静态资源)

if (handler instanceof HandlerMethod) {
    // 只处理 Controller 方法
}

五、拦截器 vs 过滤器

对比项 拦截器 过滤器
所属 Spring MVC Servlet
是否能注入 Bean
能拿到 Controller 信息
执行时机 DispatcherServlet 之后 请求最前面

六、常见坑

静态资源被拦截
✅ 排除路径或实现 WebMvcConfigurer

拦截器没生效
✅ 确保有 @Configuration 并注册

拦截器中使用 @Autowired 为空
✅ 拦截器要通过 Spring 管理(用 @Component 或 registry 注册)


七、总结一句话

Spring 拦截器 = Controller 前后统一处理逻辑

如果你愿意,我可以:

  • 给你一个 完整 demo
  • 对比 Interceptor vs AOP
  • 或结合 JWT / 登录鉴权 写一个实战示例
向AI问一下细节

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

AI