Spring Boot RestController : Intercept incoming requests

标签 spring request interceptor

我目前正在编写某种框架,允许其他人为其编写 REST Controller 。当然,我希望那些“其他人”尽可能少地与我的代码中发生的事情进行交互。

具体来说,我想要并且需要访问请求数据(即 在请求由其余 Controller 处理之前的 RequestEntity 。在 Controller 处理请求之前“拦截”请求,然后才让 Controller 处理它。

考虑以下代码:

@RestController
@RequestMapping("/")
public class MyController {

    @GetMapping("/")
    @ResponseBody
    public ResponseEntity<String> getSomething(RequestEntity requestEntity) {

        MyClass.doStuffWithRequestEntity(requestEntity);
        // ...

现在我需要的是调用 ExternalClass.doStuffWithRequestEntity(requestEntity); 而无需显式调用它。是否可以在某个类中调用某些方法(将 RequestEntity 传递给它!)而不必显式调用它?

此外,所述拦截器类应该创建并配置一个对象,然后该对象再次可供其余 Controller 使用。

我会想类似的事情

class RestController {
    @RestController
    @RequestMapping("/")
    public class MyController {

        @GetMapping("/")
        @ResponseBody
        public ResponseEntity<String> getSomething() {

            MyClass x = MyClass.getInstanceCreatedByInterceptor();
        }
    }
}

class Interceptor {
    public void doStuffWithRequestEntity(requestEntity) {

        MyClass x = new MyClass();
        x.fillObjectWithData();
    }
}

之前被执行过。

这个想法是,每个(!)传入请求都会被解析,并且其内容会被解码,而其余 Controller 的程序员根本不必关心这一点。他们应该只通过/从 MyClass 实例访问数据。

有办法做到这一点吗?

最佳答案

Spring-boot 允许我们配置自定义拦截器。通常在 Spring Boot 应用程序中,所有内容都是自动配置的,在这种情况下,我们可以使用 WebMvcConfigurerAdapter自定义它。只需扩展 WebMvcConfigurerAdapter 并在此类中提供所需的配置即可。

记得添加@Configuration注解,以便Spring在组件扫描期间拾取该类。

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

  @Autowired 
  HandlerInterceptor customInjectedInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(...)
    ... 
    registry.addInterceptor(customInjectedInterceptor).addPathPatterns("/**");
  }
}

这就是您通常向 Spring Boot 应用程序添加拦截器的方式。希望这可以帮助回答您的问题。

从 spring 5.x.x 或 spring-boot 2 开始WebMvcConfigurerAdapter 被标记为已弃用。WebMvcConfigurer 接口(interface)(由抽象类 WebMvcConfigurerAdapter),从 Spring 5 开始,包含其所有方法的默认实现。因此,抽象适配器类被标记为已弃用。如果您愿意,可以采用它,如下所示:

@Configuration
public WebConfig implements WebMvcConfigurer {
    // ...
}

关于Spring Boot RestController : Intercept incoming requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55852142/

相关文章:

java - 仅限 Spring Security SessionRegistry java 配置

node.js - 取消设置 NODE_DEBUG 变量

java - Spring boot 不接收从 Angular 客户端添加的请求 header

jakarta-ee - @AroundInvoke 拦截器在哪里调用?

java - Spring Batch如何在写入步骤之前处理数据列表

spring - 使用Spring Boot服务音频文件

java - JPA - 返回 StartDate 之后和 EndDate 之前的实体

javascript - 如何在Angular 6中发送ajax请求?

Node.js 请求库——将文本/xml 发布到正文?

java - 如何在gRPC拦截器中访问消息请求?