ResponseBodyAdvice(返参解密)
ResponseBodyAdvice 是 Spring Web MVC 中的一个接口,它允许开发者在控制器方法执行之后,但在视图呈现之前,对响应体进行定制化处理。
以下是关于 ResponseBodyAdvice 的详细解释:
-
定义与作用:
ResponseBodyAdvice的主要目的是为响应体提供额外的处理逻辑。例如,你可以使用这个接口来修改响应体的媒体类型、编码、或者添加额外的响应头等。 -
实现方法:要使用
ResponseBodyAdvice,你需要创建一个类并实现该接口。接口中有两个主要的方法:beforeBodyWrite和afterBodyRead。beforeBodyWrite方法在写入响应体之前调用,可以用于修改响应体或响应头等信息。afterBodyRead方法在读取请求体之后调用,可以用于修改请求体或请求头等信息。
-
配置使用:创建了
ResponseBodyAdvice的实现类后,需要将其注册到 Spring 容器中。通常可以通过在配置类上使用@EnableWebMvc注解,并在该配置类中重写addInterceptors方法来完成注册。 -
使用场景:
ResponseBodyAdvice常用于以下场景:- 修改响应体的内容或格式。
- 添加全局的响应头信息,如缓存控制头。
- 处理跨域资源共享(CORS)问题。
- 统一处理返回数据的包装和解包。
-
注意事项:在使用
ResponseBodyAdvice时,需要注意以下几点:- 确保
beforeBodyWrite方法在修改响应体后返回BodyContentModifier对象,以便 Spring 知道如何处理修改后的响应体。 - 如果需要在多个地方使用相同的
ResponseBodyAdvice,可以考虑使用@ControllerAdvice注解,这样可以避免重复代码。 - 当使用
ResponseBodyAdvice时,确保理解其在整个请求处理流程中的位置和作用,以避免意外的副作用。
- 确保
总之,ResponseBodyAdvice 提供了一种灵活的方式来定制 HTTP 响应体,使得开发者可以在不修改原有控制器代码的情况下,对响应进行统一的处理和优化。
public interface ResponseBodyAdvice<T> {
boolean supports(MethodParameter var1, Class<? extends HttpMessageConverter<?>> var2);
@Nullable
T beforeBodyWrite(@Nullable T var1, MethodParameter var2, MediaType var3, Class<? extends HttpMessageConverter<?>> var4, ServerHttpRequest var5, ServerHttpResponse var6);
}
HandlerInterceptorAdapter(入参加密)
HandlerInterceptorAdapter 提供了一种灵活且强大的方式来实现 Web 应用程序中的拦截器逻辑。通过继承这个适配器类并实现其方法,开发者可以在请求处理的不同阶段插入自定义逻辑,从而实现各种非侵入式的横切关注点,如加解密、安全控制、日志记录和性能监控等。正确使用 HandlerInterceptorAdapter 可以显著提高应用程序的模块化和可维护性。
HandlerInterceptorAdapter 是 Spring MVC 框架中提供的一个适配器类,用于实现请求处理过程中的拦截器功能。下面将详细探讨 HandlerInterceptorAdapter 的工作原理和应用场景:
-
定义与作用
- 定义:
HandlerInterceptorAdapter是一个实现了HandlerInterceptor接口的抽象类,提供了三个可供重写的方法:preHandle、postHandle和afterCompletion。这些方法分别在不同的请求处理阶段被调用,允许开发者在请求处理的不同阶段插入自定义逻辑。 - 作用:通过继承
HandlerInterceptorAdapter并重写相应的方法,开发者可以创建自定义的拦截器,以实现对 HTTP 请求的预处理、后处理以及完成处理。这为应用程序提供了一种灵活的方式来实现诸如身份验证、授权、日志记录、性能监控等功能。
- 定义:
-
方法详解
- preHandle:此方法在请求处理之前被调用,即在控制器方法被执行之前。它接收请求和响应对象以及处理器对象作为参数。如果此方法返回
false,则请求将被拦截,不会继续执行后续的操作。这可以用来实现如权限检查等预处理逻辑。 - postHandle:此方法在整个请求处理完毕后,但在视图渲染之前被调用。它允许修改
ModelAndView对象,从而影响最终的响应。这个方法通常用于添加额外的响应头或进行一些资源清理工作。 - afterCompletion:此方法在所有请求处理完成后被调用,无论请求是否成功。这包括了视图渲染之后的阶段。该方法通常用于资源释放,如关闭数据库连接、清理线程局部变量等。
- preHandle:此方法在请求处理之前被调用,即在控制器方法被执行之前。它接收请求和响应对象以及处理器对象作为参数。如果此方法返回
-
配置使用
- 为了使自定义的拦截器生效,需要将其注册到 Spring MVC 的配置中。这通常通过创建一个配置类,继承
WebMvcConfigurer并重写addInterceptors方法来完成。在该方法中,可以将自定义的拦截器添加到拦截器注册表中,从而激活其功能。
- 为了使自定义的拦截器生效,需要将其注册到 Spring MVC 的配置中。这通常通过创建一个配置类,继承
-
使用场景
-
HandlerInterceptorAdapter常用于实现以下场景:- 身份验证和授权:在
preHandle方法中检查用户是否已登录或有特定权限。 - 性能监控:在
preHandle和postHandle方法中记录请求开始和结束的时间,以计算处理耗时。 - 日志记录:在
preHandle和afterCompletion方法中记录请求信息和处理结果。 - 异常处理:在
afterCompletion方法中捕获并处理请求处理过程中发生的异常。
- 身份验证和授权:在
-
-
注意事项
-
在使用
HandlerInterceptorAdapter时,应注意避免在拦截器中进行复杂的业务逻辑处理,以免影响请求处理的性能。 -
确保在重写
preHandle方法时正确处理返回值,以避免意外拦截合法请求。 -
在多线程环境下使用时,应特别注意线程安全问题,尤其是在
afterCompletion方法中进行资源释放时。
-
落地可参考 cn.licoy.encrypt-body-spring-boot-starter
<dependency>
<groupId>cn.licoy</groupId>
<artifactId>encrypt-body-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>