当前位置: 代码网 > it编程>编程语言>Java > spring中Interceptor的使用小结

spring中Interceptor的使用小结

2025年12月14日 Java 我要评论
一、interceptor 的核心概念interceptor(拦截器) 是 spring mvc 提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑。其核心作用包括:预处理:在控制器方法执行前进行

一、interceptor 的核心概念

interceptor(拦截器) 是 spring mvc 提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑。其核心作用包括:

  • 预处理:在控制器方法执行前进行权限校验、日志记录等。
  • 后处理:在控制器方法执行后修改响应数据或记录结果。
  • 资源清理:在整个请求完成后释放资源或处理异常。

与 filter 的区别:

特性interceptor(拦截器)filter(过滤器)
作用范围针对 spring mvc 的控制器层作用于 servlet 容器层面
依赖框架spring mvc 管理servlet 原生规范
数据访问可操作 modelandview仅能操作 httpservletrequest/response。

二、interceptor 的创建与配置

  1. 实现拦截器类
    继承 handlerinterceptor 接口,重写以下方法:
public class authinterceptor implements handlerinterceptor {
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) {
        // 请求前处理(如权限校验)
        return true; // 返回 false 中断请求
    }

    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) {
        // 控制器执行后、视图渲染前处理(如修改 model 数据)
    }

    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) {
        // 请求完成后处理(如资源清理)
    }
}
  1. 注册拦截器
    通过 webmvcconfigureraddinterceptors 方法配置:
@configuration
public class webconfig implements webmvcconfigurer {
    @override
    public void addinterceptors(interceptorregistry registry) {
        registry.addinterceptor(new authinterceptor())
                .addpathpatterns("/api/**")     // 拦截路径
                .excludepathpatterns("/login"); // 排除路径
    }
}
  • 路径匹配规则:支持 ant 风格(如 /user/* 匹配单层路径,/admin/** 匹配多级路径)。
  • 多拦截器顺序:通过 order 注解或实现 ordered 接口控制优先级,值越小优先级越高。

三、拦截器的执行顺序

假设注册了 interceptor1 和 interceptor2:

  1. prehandle 方法:按注册顺序执行(interceptor1 → interceptor2)。
  2. posthandle 方法:按注册逆序执行(interceptor2 → interceptor1)。
  3. aftercompletion 方法:按注册逆序执行(interceptor2 → interceptor1)。

中断场景:若某一拦截器的 prehandle 返回 false,后续拦截器和控制器均不执行,但已通过 prehandle 的拦截器的 aftercompletion 仍会执行。

四、典型应用场景

  1. 权限校验
    prehandle 中检查用户登录状态或角色权限,拒绝非法请求。

    if (request.getsession().getattribute("user") == null) {
        response.sendredirect("/login");
        return false;
    }
    
  2. 日志记录
    记录请求路径、参数、耗时等信息:

    long starttime = system.currenttimemillis();
    request.setattribute("starttime", starttime);
    // 在 aftercompletion 中计算耗时
    
  3. 性能监控
    统计接口响应时间,优化慢请求。

  4. 数据预处理
    posthandle 中统一添加响应头或加密敏感数据。

五、注意事项与最佳实践

性能优化

  • 避免在拦截器中执行耗时操作(如远程调用)。
  • 合理设置拦截路径,减少不必要的拦截。

常见问题排查

  • 拦截器未生效:检查路径匹配规则、是否注册到 spring 容器。
  • 顺序混乱:通过 @order 明确优先级。

与 aop 结合

  • 拦截器适用于请求生命周期中的横切逻辑,而 aop 更适用于方法级别的切面(如事务管理)。

六、完整示例

  1. 日志拦截器
public class loginterceptor implements handlerinterceptor {
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) {
        system.out.println("请求开始: " + request.getrequesturi());
        return true;
    }

    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) {
        system.out.println("请求完成: " + request.getrequesturi());
    }
}
  1. 配置类
@configuration
public class webconfig implements webmvcconfigurer {
    @override
    public void addinterceptors(interceptorregistry registry) {
        registry.addinterceptor(new loginterceptor()).addpathpatterns("/**");
        registry.addinterceptor(new authinterceptor())
                .addpathpatterns("/admin/**")
                .order(1); // 高优先级
    }
}

总结

spring interceptor 是处理请求生命周期横切逻辑的利器,通过灵活配置路径和优先级,可实现权限控制、日志记录等通用功能。结合 prehandleposthandleaftercompletion 的分阶段处理,能有效提升代码复用性和可维护性。

到此这篇关于spring中interceptor的使用小结的文章就介绍到这了,更多相关spring interceptor使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com