Spring boot 拦截器

举报
林欣 发表于 2024/06/23 15:50:17 2024/06/23
【摘要】 前言在Spring Boot中,拦截器(Interceptor)是一种用于在请求被处理之前和之后执行特定逻辑的强大工具。它们通常用于执行诸如日志记录、身份验证、授权、性能监控等任务。在Spring Boot应用中,拦截器可以通过实现HandlerInterceptor接口或扩展HandlerInterceptorAdapter类来创建。以下是使用Spring Boot拦截器的基本步骤: 1...

前言

在Spring Boot中,拦截器(Interceptor)是一种用于在请求被处理之前和之后执行特定逻辑的强大工具。它们通常用于执行诸如日志记录、身份验证、授权、性能监控等任务。

在Spring Boot应用中,拦截器可以通过实现HandlerInterceptor接口或扩展HandlerInterceptorAdapter类来创建。以下是使用Spring Boot拦截器的基本步骤:

1. 创建拦截器

通过实现HandlerInterceptor接口或扩展HandlerInterceptorAdapter类,定义你的拦截器。你需要至少覆盖以下三个方法中的一个或多个:

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler): 在请求处理之前调用。如果返回false,则请求将被拒绝,不会继续执行后续的拦截器和控制器方法。
  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView): 在请求处理之后,但在视图渲染之前调用。
  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex): 在整个请求处理完成后调用,即视图渲染之后。

示例:

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在这里执行你的逻辑,例如记录日志或检查权限
        // 如果返回false,请求将被拒绝
        return true;
    }

    // 可以选择性地覆盖postHandle和afterCompletion方法
}

2. 注册拦截器

在Spring Boot中,你需要将拦截器注册到WebMvcConfigureraddInterceptors方法中。你可以通过实现WebMvcConfigurer接口或扩展WebMvcConfigurerAdapter(如果你使用的是较旧的Spring Boot版本)来完成这一步骤。

示例:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/error", "/static/**", "/css/**", "/js/**", "/images/**"); // 排除某些路径
    }
}

在上面的示例中,addPathPatterns方法指定了哪些路径应该被拦截,而excludePathPatterns方法则指定了哪些路径应该被排除在拦截之外。

3. 测试拦截器

启动你的Spring Boot应用,并发送请求以测试拦截器是否按预期工作。你可以通过查看日志输出、检查响应内容或使用调试工具来验证拦截器的行为。

4. postHandle 和 afterCompletion 的区别

在Spring Boot中,拦截器(Interceptor)是Spring MVC框架中的一个重要组件,它用于在请求处理过程中执行特定的逻辑。拦截器通常实现HandlerInterceptor接口,该接口定义了三个方法:preHandlepostHandleafterCompletion。下面我将详细解释postHandleafterCompletion方法的触发时机:

  1. postHandle方法
  • 函数声明

    void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
                     @Nullable ModelAndView modelAndView) throws Exception;
    
  • 说明

    • 此方法在控制器处理请求方法调用之后,在解析视图之前执行。
    • 可以通过此方法对请求域中的模型和视图做进一步修改。
    • 如果preHandle方法返回false,则此方法不会被执行。
  • 参数

    • HttpServletRequest request:当前的HTTP请求。
    • HttpServletResponse response:当前的HTTP响应。
    • Object handler:被调用的处理器(通常是HandlerMethodHandlerAdapter的实例)。
    • @Nullable ModelAndView modelAndView:控制器返回的ModelAndView对象(如果有的话),可以为null
  • 触发时机:在控制器方法成功执行后,但在视图渲染之前。也就是说,当请求被控制器处理完毕并返回ModelAndView对象(或者相应的响应)时,postHandle方法会被触发。

  • 作用:这个方法可以对控制器方法返回的ModelAndView对象进行后处理,例如添加额外的模型属性或修改响应内容。

  • 细节:如果preHandle方法返回false,则postHandle方法将不会被调用,因为请求已经被拦截器阻止,没有进入控制器方法。

  1. afterCompletion方法
    • 函数声明
      void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, 
                           @Nullable Exception ex) throws Exception;
      
    • 说明
      • 此方法在视图渲染完成之后执行,通常用于资源清理、记录日志信息等工作。
      • 此方法只有在preHandle方法被成功执行并返回true时才会被执行。
    • 参数
      • HttpServletRequest request:当前的HTTP请求。
      • HttpServletResponse response:当前的HTTP响应。
      • Object handler:被调用的处理器(与postHandle相同)。
      • @Nullable Exception ex:在请求处理过程中出现的异常(如果有的话),可以为null
    • 触发时机:在整个请求处理完成之后,包括控制器方法的执行和视图的渲染。具体来说,当DispatcherServlet处理完请求并返回给客户端后,afterCompletion方法会被触发。
    • 作用:这个方法通常用于清理资源、记录日志或执行一些需要在请求结束后执行的逻辑。
    • 细节:即使preHandle方法返回false导致请求没有进入控制器方法,afterCompletion方法仍然会被调用(前提是该拦截器在preHandle中返回了true或者根本没有preHandle方法)。但需要注意的是,如果在preHandle中返回了false,那么postHandle方法将不会被调用,即使afterCompletion会。

总结

  • postHandle在控制器方法执行之后、视图渲染之前被触发,用于对控制器方法的返回值进行后处理。
  • afterCompletion在整个请求处理完成之后被触发,包括控制器方法和视图渲染,用于执行一些需要在请求结束后执行的逻辑。

这两个方法提供了在请求处理过程中的不同阶段执行额外逻辑的能力,使得开发者能够更加灵活地控制请求的处理流程。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。