为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot拦截器的使用指南

这篇文章是关于Spring和Spring Boot拦截器(Interceptors)

看看我详细的视频,和订阅我的频道加入我们的大家庭吧!你的支持对我来说真的很重要!

在这段视频里,我们谈到了几个关键方面:

  1. 创建拦截器吗?
  2. 注册拦截器?
  3. 注册多个拦截器吗?
  4. 如何为特定URL模式注册拦截器呢?

Spring Boot 的拦截器是一种强大的工具,可以拦截应用中的 HTTP 请求和响应。

它们属于 Spring Web MVC 框架,在控制器处理请求之前和之后允许你执行操作。

创建拦截器

要创建一个拦截器,你需要实现 HandlerInterceptor 接口或继承 HandlerInterceptorAdapter 类。

    包 com.javacodeex.interceprots;  

    import jakarta.servlet.http.HttpServletRequest;  
    import jakarta.servlet.http.HttpServletResponse;  
    import lombok.extern.slf4j.Slf4j;  
    import org.springframework.stereotype.Component;  
    import org.springframework.web.servlet.HandlerInterceptor;  
    import org.springframework.web.servlet.ModelAndView;  

    @Slf4j  
    @Component  
    public 类 LoggingInterceptor implements HandlerInterceptor {  

        @Override  
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
            log.info("请求 URL: " + request.getRequestURL());  
            log.info("请求 Method: " + request.getMethod());  
            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 exception) throws Exception {  
            // 可在此处记录处理完成详情  
            log.info("请求处理完成");  
        }  
    }
    package com.javacodeex.interceprots;  

    import jakarta.servlet.http.HttpServletRequest;  
    import jakarta.servlet.http.HttpServletResponse;  
    import lombok.extern.slf4j.Slf4j;  
    import org.springframework.stereotype.Component;  
    import org.springframework.web.servlet.HandlerInterceptor;  
    import org.springframework.web.servlet.ModelAndView;  

    @Slf4j  
    @Component  
    public class ProductInterceptor implements HandlerInterceptor {  

        @Override  
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
            log.info("请求 URL: " + request.getRequestURL());  
            log.info("请求方法: " + request.getMethod());  
            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 exception) throws Exception {  
            // 可在此处记录完成信息  
            log.info("请求处理完成");  

        }  
    }

注册拦截器插件

    package com.javacodeex.config;  

    import com.javacodeex.interceprots.LoggingInterceptor;  
    import com.javacodeex.interceprots.ProductInterceptor;  
    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 LoggingInterceptor loggingInterceptor;  

        @Autowired  
        private ProductInterceptor productInterceptor;  

        @Override  
        public void addInterceptors(InterceptorRegistry registry) {  
            registry.addInterceptor(loggingInterceptor)  
                    .addPathPatterns("/api/**") // 拦截需要处理的 URL 模式  
                    .excludePathPatterns("/api/auth/**"); // 排除需要拦截的 URL 模式  

            registry.addInterceptor(productInterceptor)  
                    .addPathPatterns("/product/**") // 拦截需要处理的 URL 模式  
                    .excludePathPatterns("/api/auth/**");  
        }  
    }
    import lombok.extern.slf4j.Slf4j;  
    import org.springframework.web.bind.annotation.GetMapping;  
    import org.springframework.web.bind.annotation.RequestMapping;  
    import org.springframework.web.bind.annotation.RestController;  

    @RestController  
    @RequestMapping("/api")  
    @Slf4j  
    public class CustomerController {  

        @GetMapping  
        public String getMessage(){  
            log.info("getMessage()");  
            return "欢迎来到拦截器会话";  
        }  
    }
    package com.javacodeex.controller;  

    import lombok.extern.slf4j.Slf4j;  
    import org.springframework.web.bind.annotation.GetMapping;  
    import org.springframework.web.bind.annotation.RequestMapping;  
    import org.springframework.web.bind.annotation.RestController;  

    @RestController  
    @RequestMapping("/product")  
    @Slf4j  
    public class ProductController {  

        @GetMapping  
        public String getProduct(){  

            log.info("getProduct()");  
            return "product information";  
        }  
    }

Spring Boot拦截器的生命周期

  • preHandle :在实际处理器被执行之前被调用。此方法可用于执行预处理任务(比如记录日志、身份验证等)。如果返回 false,执行链将被中断,导致后续处理不被执行。
  • postHandle :在处理器执行后但在 ModelAndView 渲染之前被调用。此方法可用于在 ModelAndView 渲染之前对其进行修改。
  • afterCompletion :在请求完全处理完毕后被调用。此方法可用于清理工作。

过滤器和拦截器都是处理Spring Boot应用中HTTP请求和响应的机制,但它们在不同的层级上工作并且有不同的目的。以下是它们的主要区别:

过滤

生命周期和位置

  • 过滤器属于Servlet API,并可以配置在web.xml文件中,或者在Spring Boot应用中通过注解配置。
  • 过滤器应用于所有传入请求,并可用于执行如认证、日志记录和输入校验等任务。

执行位置

  • 过滤器在请求处理过程的前后都会被执行,包括在请求转发到 servlet 或控制器之前和之后。

范围

  • 过滤器可以应用到所有或特定的 URL 模式上,并且它们在请求到达 servlet 或控制器之前,在最底层起作用。

设置

  • 过滤器可以通过 @WebFilter 注解进行配置,或者作为 bean 注册到 FilterRegistrationBean

应用场景

  • 常用于诸如安全、日志记录和输入输出过滤等横切关注点。
拦截器

生命周期和位置

  • 拦截器(Interceptors)是Spring MVC框架的一部分,并通过Spring的配置类来配置。
  • 拦截器用于在执行控制器中的方法之前和之后进行操作。

执行位置

  • 拦截器在请求生命周期中的关键点会被执行:在控制器方法调用前(preHandle),在控制器方法调用后但在视图渲染前(postHandle),以及在请求处理完毕后(afterCompletion)。

范围定义

  • 拦截器可以应用于所有或特定的 URL 模式,并可以按顺序链接。
  • 它们在较高层级上运作,与控制器(处理器)和视图进行交互。

设置

  • 通过实现 HandlerInterceptor 接口,并在实现 WebMvcConfigurer 接口的配置类中注册这些拦截器来配置拦截器的方式。

场景

  • 常用于执行如日志记录、安全验证、修改 ModelAndView 对象的等需要在请求生命周期中特定点的操作。

谢谢啦,继续加油哦!

Java代码

谢谢读到最后,在你离开前:

  • 请考虑拍手支持作者哦!👏
  • YouTube支持我们吧

跟着我,更多精彩等你来!

[点击这里关注我在Medium上的文章](https://medium.com/https://medium.com/@saijanand)

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消