螺竹编程
发布于 2024-06-01 / 3 阅读
0

SpringBoot基础/Web:SpringBoot Interceptor

介绍

Interceptor(拦截器)是在Web开发中用于拦截处理请求和响应的一种机制。它类似于Filter(过滤器),但提供了更精细的控制和功能。

在Java Web开发中,Interceptor主要用于拦截处理请求的控制器(如Spring MVC中的Controller)的调用过程,并可以在该过程中执行一些预处理和后处理逻辑。它可以用于实现诸如身份验证、授权、日志记录、性能监控等功能。Interceptor通常与框架(如Spring MVC)紧密结合使用。

以下是Interceptor的一些关键特点和用法:

  1. 拦截器链:Interceptor可以形成一个拦截器链,按照定义的顺序依次执行,可以有多个Interceptor组成一个链。这样可以实现不同拦截器的协同工作,每个拦截器都可以对请求进行处理或修改。

  2. 预处理和后处理:Interceptor提供了预处理和后处理的机制。在请求到达控制器之前,Interceptor可以进行一些预处理操作,如参数校验、权限验证等。在控制器处理完请求并生成响应后,Interceptor可以对响应进行后处理操作,如记录日志、添加额外的响应头等。

  3. 取消或继续处理:Interceptor可以决定是否取消或继续处理请求。通过返回truefalse来控制请求的继续流程。如果拦截器返回false,则请求将被取消,后续拦截器和控制器将不会执行;如果返回true,则请求将继续进行后续拦截器和控制器的处理。

  4. 可配置性:Interceptor通常可以通过配置进行启用和禁用,并可以指定拦截的URL模式或特定的控制器。这样可以灵活地控制哪些请求需要被拦截器处理。

  5. 多个拦截器的顺序:在拦截器链中,可以通过配置指定多个拦截器的顺序。这种顺序可以影响拦截器的执行顺序,从而实现不同拦截器之间的逻辑关系。

Demo

项目地址:CodeCoderCoding/Spring-Boot-Demo: Spring-Boot的Demo。Spring-Boot基础、Spring-Boot与数据库、Spring-Boot与安全、Spring-Boot与消息队列 (github.com)

项目核心代码如下:

WebMvcConfig

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * CodeCoderCoding
 * 配置拦截器
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/myInterceptor");
    }
}

MyInterceptor

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * CodeCoderCoding
 * 创建拦截器
 * 拦截器中的方法按照preHandle -> Controller -> postHandle -> afterCompletion的执行顺序
 */
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler){
        System.out.println("myInterceptor->preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView modelAndView){
        System.out.println("myInterceptor->postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception ex){
        System.out.println("myInterceptor->afterCompletion");
    }
}

InterceptorController

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author CodeCoderCoding
 */
@RestController
public class InterceptorController {
    @GetMapping("/myInterceptor")
    public String myInterceptor(){
        return "myInterceptor";
    }
    @GetMapping("/myInterceptor1")
    public String myInterceptor1(){
        return "myInterceptor1";
    }
}