Skip to content

Latest commit

 

History

History
111 lines (83 loc) · 5.87 KB

File metadata and controls

111 lines (83 loc) · 5.87 KB

About Interceptors

在 Spring Boot 中,拦截器(Interceptor)是一种用于拦截请求和响应的组件。拦截器允许你在请求处理前后执行预处理和后处理逻辑。它是 Spring 框架中的一部分,使用了 AOP(面向切面编程)的思想,用于处理横切关注点(cross-cutting concerns),如日志记录、权限检查、跨域处理等。

Spring Boot 的拦截器基于 HandlerInterceptor 接口实现,这个接口定义了三个方法:preHandle、postHandle 和 afterCompletion。这些方法允许你在请求处理的不同阶段执行定制化的逻辑。

preHandle 方法:在实际的请求处理器(Controller)执行之前调用,允许你对请求进行预处理。如果该方法返回 true,请求将继续传递到 Controller 进行处理;如果返回 false,请求将被拦截,不会继续传递给 Controller。

postHandle 方法:在请求处理器(Controller)执行之后、视图渲染之前调用,允许你对返回的 Model 和视图进行后处理。

afterCompletion 方法:在请求完成并响应发送到客户端后调用,允许你执行一些清理工作或记录请求执行的时间等。

你可以创建一个实现 HandlerInterceptor 接口的自定义拦截器,并在 Spring Boot 中进行配置,将其加入到拦截器链中,从而实现对请求和响应的拦截和处理。

下面是一个简单的示例,演示如何创建和配置一个自定义拦截器:

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

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

public class CustomHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // Pre-processing logic here
        return true; // Allow the request to proceed to the controller
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // Post-processing logic here
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        // Cleanup or additional tasks here
    }
}

然后,将拦截器注册到 Spring Boot 应用程序的拦截器链中,通常在 WebMvcConfigurer 中进行配置:

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 WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomHandlerInterceptor());
    }
}

通过以上配置,自定义的拦截器将会在每个请求进入和响应返回的过程中起作用,允许你对请求和响应进行必要的处理。

关于HandlerMethod

在 Spring Framework 和 Spring Boot 中,HandlerMethod 是一个用于描述处理请求的方法的类。它主要用于处理请求映射(Request Mapping)和请求处理器(Controller)之间的关联。当客户端发起一个 HTTP 请求时,Spring Boot 的请求处理流程将在请求映射阶段确定匹配的处理器方法,这就是 HandlerMethod 的作用所在。

HandlerMethod 对象包含了以下重要信息:

Controller 类:处理请求的控制器类的实例。 Method 对象:处理请求的方法本身,包括方法名、参数等信息。 Bean 实例:控制器类本身作为一个 Spring Bean 的实例。 这些信息允许 Spring Boot 在执行请求时找到匹配的处理器方法,并调用它来处理请求。 HandlerMethod 是 Spring Boot 在处理请求时的关键组件之一,帮助实现了请求的路由、参数绑定、响应返回等功能。

你可以通过 HandlerMethod 获取有关处理器方法的信息,并在需要时对其进行自定义操作,例如获取方法名、方法参数,或者进行方法的权限检查和拦截。通常,HandlerInterceptor 中的 preHandle 方法的参数中会传递 HandlerMethod,以便开发者在拦截器中获取和处理方法级的信息。

下面是一个简单的示例,演示如何在 HandlerInterceptor 中获取 HandlerMethod:

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

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

public class CustomHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            String methodName = handlerMethod.getMethod().getName();
            Class<?> controllerClass = handlerMethod.getBeanType();
            // 在此处可以根据方法名或控制器类进行特定的处理
        }
        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 {
        // 完成处理逻辑
    }
}

总之,HandlerMethod 是 Spring Boot 中用于描述处理请求的方法的类,它提供了处理器方法的相关信息,帮助 Spring Boot 进行请求路由和处理。