新用户注册入口 老用户登录入口

SpringBoot中自定义拦截器(Interceptor)实现详解:配置HandlerInterceptor接口及在preHandle、postHandle与afterCompletion中的应用实践

文章作者:星河万里-t 更新时间:2023-02-28 11:49:38 阅读数量:152
文章标签:实现权限验证请求日志实现
本文摘要:本文详细介绍了在SpringBoot框架中如何自定义拦截器(Interceptor)以满足权限验证、请求日志记录及用户登录状态判断等实际应用场景。通过实现HandlerInterceptor接口,开发者可在preHandle、postHandle和afterCompletion方法中编写相应的业务逻辑。配置类通过继承并实现WebMvcConfigurer接口,利用addInterceptors方法将自定义拦截器添加至SpringBoot的拦截器链中,从而实现在HTTP请求处理过程中的灵活拦截与处理机制。
SpringBoot

一、引言

在我们日常开发中,有时候会遇到一些需求,需要在业务逻辑执行之前或者之后做一些额外的操作。这时候我们可以使用拦截器(Interceptor)来进行处理。在 Spring MVC 这个大家伙里,拦截器可是个大忙人,它身影广泛地出现在各个角落。比如说吧,当我们要对用户权限进行验证时,或者要对系统性能进行实时监控时,都离不开这位“幕后英雄”——拦截器的鼎力相助。本文将详细介绍 SpringBoot 如何实现自定义的拦截器。

二、自定义拦截器的原理

首先我们需要了解一下什么是拦截器。在Spring MVC这个大家伙里,拦截器就像是个扮演关键角色的小家伙,它其实就是一个实实在在的类,不过这个类得乖乖实现HandlerInterceptor接口,这样才能上岗工作。当我们发送一个 HTTP 请求给 Spring MVC 处理时,拦截器会对这个请求进行拦截,并根据我们的业务逻辑决定是否继续执行下一个拦截器或者 Controller。

三、自定义拦截器的实现步骤

接下来我们将一步步介绍如何在 SpringBoot 中实现自定义的拦截器。

1. 创建自定义拦截器实现 HandlerInterceptor 接口

public class MyInterceptor 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 {
        // 这里可以在处理完成后进行后处理操作
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 这里可以在处理完成且没有异常发生的情况下进行后续操作
    }
}

2. 需要一个配置类实现 WebMvcConfigurer 接口,并添加@Configuration注解

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }
}
3. 在配置类中重写 addInterceptors 方法,将自定义拦截器添加到拦截器链中
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor())
            .addPathPatterns("/"); // 添加拦截器路径匹配规则
}

四、自定义拦截器的应用场景

下面我们来看几个常见的应用场景。

1. 权限验证

public class AuthInterceptor implements HandlerInterceptor {
    private List<String> allowedRoles = Arrays.asList("admin", "manager");
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String username = (String) SecurityContextHolder.getContext().getAuthentication().getName();
        if (!allowedRoles.contains(username)) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN);
            return false;
        }
        return true;
    }
}
在这个例子中,我们在 preHandle 方法中获取了当前用户的用户名,然后检查他是否有权访问这个资源。如果没有,则返回 403 Forbidden 错误。

2. 记录请求日志

public class LogInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        long start = System.currentTimeMillis();
        System.out.println("开始处理请求:" + request.getRequestURL() + ",参数:" + request.getParameterMap());
        return true;
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long end = System.currentTimeMillis();
        System.out.println("结束处理请求:" + request.getRequestURL() + ",耗时:" + (end - start));
    }
}
在这个例子中,我们在 preHandle 和 afterCompletion 方法中分别记录了请求开始时间和结束时间,并打印了相关的信息。

3. 判断用户是否登录

public class LoginInterceptor implements HandlerInterceptor {
    private User user;
    public LoginInterceptor(User user) {
        this.user = user;
    }
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (user != null) {
            return true;
        } else {
            response.sendRedirect("/login");
            return false;
        }
    }
}
在这个例子中,我们在 preHandle 方法中判断用户是否已经登录,如果没有,则跳转到登录页面。
总结
以上就是如何在 SpringBoot 中实现自定义的拦截器。拦截器是一个非常强大的功能,可以帮助我们解决很多复杂的问题。但是伙计们,你们得留意了,过度依赖拦截器这玩意儿,可能会让代码变得乱七八糟、一团乱麻,维护起来简直能让你头疼欲裂。所以呐,咱们一定要悠着点用,合理利用这个小工具才是正解。希望这篇文章对你有所帮助!
相关阅读
文章标题:在Spring Boot应用中配置Nginx反向代理并实现HTTPS的SSL证书设置,包括请求路径获取与proxy_pass用法详解

更新时间:2024-01-22
在Spring Boot应用中配置Nginx反向代理并实现HTTPS的SSL证书设置,包括请求路径获取与proxy_pass用法详解
文章标题:SpringBoot连接H2数据库失败:配置错误、驱动加载问题与解决方案实操分析

更新时间:2023-06-25
SpringBoot连接H2数据库失败:配置错误、驱动加载问题与解决方案实操分析
文章标题:WebSocket连接数超出配置限制的解决方案:优化服务器资源、网络带宽与Spring Boot配置实践

更新时间:2023-03-10
WebSocket连接数超出配置限制的解决方案:优化服务器资源、网络带宽与Spring Boot配置实践
文章标题:SpringBoot中自定义拦截器(Interceptor)实现详解:配置HandlerInterceptor接口及在preHandle、postHandle与afterCompletion中的应用实践

更新时间:2023-02-28
SpringBoot中自定义拦截器(Interceptor)实现详解:配置HandlerInterceptor接口及在preHandle、postHandle与afterCompletion中的应用实践
文章标题:SpringBoot异常处理:全局异常处理与自定义异常实例

更新时间:2024-11-11
SpringBoot异常处理:全局异常处理与自定义异常实例
文章标题:Spring Boot项目中利用DevTools实现热部署:引入依赖、配置自动重启与代码修改生效实践

更新时间:2023-09-08
Spring Boot项目中利用DevTools实现热部署:引入依赖、配置自动重启与代码修改生效实践
名词解释
作为当前文章的名词解释,仅对当前文章有效。
拦截器(Interceptor)在Spring MVC框架中,拦截器是一种设计模式实现,它允许开发者在请求处理的预处理阶段(preHandle方法)、后处理阶段(postHandle方法)以及整个请求完成阶段(afterCompletion方法)插入自定义的业务逻辑。拦截器通过实现HandlerInterceptor接口来创建,并在Spring Boot应用中通过WebMvcConfigurer配置类进行注册和路径匹配规则设置,从而对特定HTTP请求进行拦截并执行相应的操作,例如权限验证、日志记录或性能监控等。
HandlerInterceptor接口在Spring MVC框架中,HandlerInterceptor是一个核心接口,用于定义拦截器的行为规范。该接口提供了三个方法。
WebMvcConfigurer接口在Spring Boot项目中,WebMvcConfigurer是一个用于扩展Spring MVC功能的接口,允许开发者自定义MVC配置,如视图解析、静态资源处理、消息转换器配置等。本文中提到的,通过实现WebMvcConfigurer接口并在其实现类中重写addInterceptors方法,可以将自定义的拦截器添加到Spring MVC的拦截器链中,进而影响所有符合指定路径匹配规则的HTTP请求处理流程。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在深入理解并掌握了SpringBoot中如何实现自定义拦截器后,我们还可以进一步探索拦截器在实际项目开发中的更多应用场景与最佳实践。近期,随着微服务架构的广泛应用,拦截器在API网关层的角色愈发重要。例如,Netflix Zuul和Spring Cloud Gateway等API网关框架也支持自定义拦截器机制,用于统一处理跨服务的安全认证、限流熔断、日志记录等功能。
此外,在Web安全领域,拦截器常被用来实现更精细的权限控制和会话管理策略。例如,通过集成OAuth2或JWT等身份验证机制,可以在拦截器中实现对请求令牌的有效性校验,从而确保资源服务器的安全访问。
对于性能优化层面,拦截器亦可发挥关键作用,比如进行SQL日志监控以分析数据库查询效率,或者整合AOP(面向切面编程)技术实现更为灵活的事务管理及缓存策略。
同时,结合Spring Boot 2.x的新特性,如反应式编程模型WebFlux,拦截器的设计与实现方式也将有所变化。在响应式场景下,开发者需要关注Reactive HandlerInterceptor接口,以便在异步非阻塞环境下高效地执行预处理和后处理逻辑。
综上所述,拦截器作为Spring生态乃至众多现代Java Web框架中的核心组件之一,其设计与应用值得广大开发者持续关注和深入研究。不断跟进最新的技术和实践案例,将有助于我们更好地运用拦截器解决实际业务问题,提升系统整体质量和稳定性。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
last reboot - 显示最近的系统重启记录。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
jQuery和CSS3手风琴样式分步向导特效 09-29 逼真的js打字机效果插件 09-05 [转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo 03-11 谷歌sitemap不收录显示无法抓取怎么处理 01-26 绿色响应式课程教育机构企业网站模板 01-20 [转载]node重命名文件名_node文件批量重命名 12-30 Spring Cloud微服务架构中注册中心的必要性与服务间通信实践:服务发现、API契约与高可用性考量 11-23 vue及时通讯 10-25 docker扩展屏黑屏(openwrt扩展docker空间) 09-04 本次刷新还10个文章未展示,点击 更多查看。
响应式中文后台管理系统HTML5模板 08-30 Shell编程入门:精选Linux系统学习资源与Bash实践教程,实例演示自动化任务及文本处理提升效率 08-29 Etcd中HTTP/GRPC服务器内部错误的根源与应对:基于工作原理、Raft算法和配置更新实践 07-24 java中构造函数和方法 05-03 python正数求和为负 04-28 Gradle构建工具中依赖管理与打包:在build.gradle文件中正确包含依赖包及分组实践 04-09 Consul 中服务实例健康状态误报:网络中断影响与API修复实践 03-02 css段落首行怎么缩进字符 02-27 Datax在数据迁移中遇到HDFS NameNode不可达错误的排查与解决:服务状态、网络连接和防火墙设置详解 02-22 红色响应式美食餐饮店铺外卖网站html模板 02-17 [转载]小白鼠的逆袭 01-02
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"