SpringBoot通过拦截器打包,实现服务请求重定向mock服务

在 Spring Boot 中,我们可以使用拦截器(Interceptor)来拦截请求,并进行一些预处理或后处理操作。拦截器可以在请求到达 Controller 层之前或之后进行拦截,并可以修改请求或响应的内容。如果需要将请求重定向到 Mock 服务,我们可以在拦截器中进行相应的处理

因此我们利用拦截器,拦截某些接口,然后重定向mock服务。

两种方式:

1.直接在代码中添加

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判断请求路径是否为 /myendpoint,如果是,则重定向到 Mock 服务
        if (request.getRequestURI().equals("/myendpoint")) {
            response.sendRedirect("http://mockserver:8080/myendpoint");
            return false; // 返回 false 表示请求已经被处理完成,不需要再进行后续处理
        }
        // 如果请求路径不是 /myendpoint,则继续执行后续处理
        return true;
    }
}

在上面的例子中,我们定义了一个拦截器 MyInterceptor,实现了 HandlerInterceptor 接口,并重写了 preHandle 方法。在 preHandle 方法中,我们判断请求的路径是否为 /myendpoint,如果是,则将请求重定向到 Mock 服务的 /myendpoint 路径上,并返回 false 表示请求已经被处理完成,不需要再进行后续处理。

需要注意的是,为了能够将请求重定向到 Mock 服务上,我们需要在 response.sendRedirect() 方法中指定 Mock 服务的地址。在本例中,我们假设 Mock 服务的地址为 http://mockserver:8080

在拦截器的实现完成后,我们需要将其注册到 Spring Boot 中,使其能够生效。我们可以通过实现 WebMvcConfigurer 接口,重写 addInterceptors 方法来注册拦截器:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

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

在上面的例子中,我们实现了 WebMvcConfigurer 接口,并重写了 addInterceptors 方法。在方法中,我们将之前定义的拦截器 MyInterceptor 注册到了拦截器链中,并通过 addPathPatterns 方法指定了需要拦截的请求路径。在本例中,我们将拦截器注册到了所有路径上,因此所有请求都会被拦截并进行相应的处理。

需要注意的是,拦截器的执行顺序与其注册顺序有关。在上面的例子中,我们只注册了一个拦截器,因此其执行顺序是固定的。如果需要多个拦截器,可以通过修改注册顺序来改变拦截器的执行顺序。

以上方法是需要在业务项目中增加代码,但是对于测试来说,这样是不科学的。因此我们做一些改变。在不入侵业务代码的前提下,通过添加依赖以及配置项来进一步优化。请看方法2

2.拦截代码打包,拦截地址在yml或者properties配置项中设置

是的,你可以将这个功能打包成一个 Maven 模块,然后将其添加到项目的 pom.xml 文件中,以便在项目中使用该功能。

以下是一个示例:

  1. 创建一个 Maven 模块,命名为 mock-redirector

  2. 在该模块的 pom.xml 文件中添加依赖,以便在代码中使用 Spring Boot 和 Jackson:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
</dependencies>

3.在模块中创建一个拦截器类,实现重定向功能,并将 Mock 服务的地址作为配置属性:

@Component
public class MockRedirectorInterceptor implements HandlerInterceptor {

    private final String mockServerUrl;

    public MockRedirectorInterceptor(@Value("${mock.server.url}") String mockServerUrl) {
        this.mockServerUrl = mockServerUrl;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判断请求路径是否为 /myendpoint,如果是,则重定向到 Mock 服务
        if (request.getRequestURI().equals("/myendpoint")) {
            response.sendRedirect(mockServerUrl + "/myendpoint");
            return false; // 返回 false 表示请求已经被处理完成,不需要再进行后续处理
        }
        // 如果请求路径不是 /myendpoint,则继续执行后续处理
        return true;
    }
}

在上面的示例中,我们将 Mock 服务的地址作为构造函数参数传递,并在拦截器中使用该地址实现重定向功能。

4.在模块中创建一个配置类,用于将拦截器添加到 Spring Boot 应用程序中:

@Configuration
public class MockRedirectorConfig implements WebMvcConfigurer {

    private final MockRedirectorInterceptor mockRedirectorInterceptor;

    public MockRedirectorConfig(MockRedirectorInterceptor mockRedirectorInterceptor) {
        this.mockRedirectorInterceptor = mockRedirectorInterceptor;
    }

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

在上面的示例中,我们使用 @Configuration 注解标记了一个配置类,并在该类中将拦截器添加到 Spring Boot 应用程序中。

5.打包模块并将其添加到项目的 pom.xml 文件中:

<dependencies>
    <!-- 其他依赖 -->
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>mock-redirector</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

在上面的示例中,我们将模块的 groupId 和 artifactId 替换为实际的值,并将版本号设置为 1.0.0。然后,将该模块添加到项目的 pom.xml 文件中的 <dependencies> 元素中。这样,我们就可以在项目中使用该模块提供的拦截器功能了。

6.在springboot项目中配置

mock.server.url=http://localhost:8080

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焦躁的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值