【解决方案】【代码】【加解密】ResponseBodyAdvice(返参解密)HandlerInterceptorAdapter(入参加密)

156 阅读5分钟

ResponseBodyAdvice(返参解密)

ResponseBodyAdvice 是 Spring Web MVC 中的一个接口,它允许开发者在控制器方法执行之后,但在视图呈现之前,对响应体进行定制化处理。

以下是关于 ResponseBodyAdvice 的详细解释:

  1. 定义与作用ResponseBodyAdvice 的主要目的是为响应体提供额外的处理逻辑。例如,你可以使用这个接口来修改响应体的媒体类型、编码、或者添加额外的响应头等。

  2. 实现方法:要使用 ResponseBodyAdvice,你需要创建一个类并实现该接口。接口中有两个主要的方法:beforeBodyWriteafterBodyRead

    • beforeBodyWrite 方法在写入响应体之前调用,可以用于修改响应体或响应头等信息。
    • afterBodyRead 方法在读取请求体之后调用,可以用于修改请求体或请求头等信息。
  3. 配置使用:创建了 ResponseBodyAdvice 的实现类后,需要将其注册到 Spring 容器中。通常可以通过在配置类上使用 @EnableWebMvc 注解,并在该配置类中重写 addInterceptors 方法来完成注册。

  4. 使用场景ResponseBodyAdvice 常用于以下场景:

    • 修改响应体的内容或格式。
    • 添加全局的响应头信息,如缓存控制头。
    • 处理跨域资源共享(CORS)问题。
    • 统一处理返回数据的包装和解包。
  5. 注意事项:在使用 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 的工作原理和应用场景:

  1. 定义与作用

    • 定义HandlerInterceptorAdapter 是一个实现了 HandlerInterceptor 接口的抽象类,提供了三个可供重写的方法:preHandlepostHandle 和 afterCompletion。这些方法分别在不同的请求处理阶段被调用,允许开发者在请求处理的不同阶段插入自定义逻辑。
    • 作用:通过继承 HandlerInterceptorAdapter 并重写相应的方法,开发者可以创建自定义的拦截器,以实现对 HTTP 请求的预处理、后处理以及完成处理。这为应用程序提供了一种灵活的方式来实现诸如身份验证、授权、日志记录、性能监控等功能。
  2. 方法详解

    • preHandle:此方法在请求处理之前被调用,即在控制器方法被执行之前。它接收请求和响应对象以及处理器对象作为参数。如果此方法返回 false,则请求将被拦截,不会继续执行后续的操作。这可以用来实现如权限检查等预处理逻辑。
    • postHandle:此方法在整个请求处理完毕后,但在视图渲染之前被调用。它允许修改 ModelAndView 对象,从而影响最终的响应。这个方法通常用于添加额外的响应头或进行一些资源清理工作。
    • afterCompletion:此方法在所有请求处理完成后被调用,无论请求是否成功。这包括了视图渲染之后的阶段。该方法通常用于资源释放,如关闭数据库连接、清理线程局部变量等。
  3. 配置使用

    • 为了使自定义的拦截器生效,需要将其注册到 Spring MVC 的配置中。这通常通过创建一个配置类,继承 WebMvcConfigurer 并重写 addInterceptors 方法来完成。在该方法中,可以将自定义的拦截器添加到拦截器注册表中,从而激活其功能。
  4. 使用场景

    • HandlerInterceptorAdapter 常用于实现以下场景:

      • 身份验证和授权:在 preHandle 方法中检查用户是否已登录或有特定权限。
      • 性能监控:在 preHandle 和 postHandle 方法中记录请求开始和结束的时间,以计算处理耗时。
      • 日志记录:在 preHandle 和 afterCompletion 方法中记录请求信息和处理结果。
      • 异常处理:在 afterCompletion 方法中捕获并处理请求处理过程中发生的异常。
  5. 注意事项

    • 在使用 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>