相关推荐recommended
SpringBoot常用拦截器之ClientHttpRequestInterceptor
作者:mmseoamin日期:2024-04-29

一、SpringBoot常用拦截器

下面3种拦截器,都是http拦截器,在处理业务逻辑之前对http请求信息进行处理,比如获取请求头,请求参数,设置请求头,请求参数等等

思路清晰,先说jar包:

HandlerInterceptor—>spring-webmvc项目,org.springframework.web.servlet.HandlerInterceptor
ClientHttpRequestInterceptor—>spring-web项目,org.springframework.http.client.ClientHttpRequestInterceptor
RequestInterceptor—>feign-core项目,feign.RequestInterceptor

一目了然,从项目名称和包路径可以看出,3个拦截器分别属于3个不同的项目,所以他们之前的作用也有区别,在这里我大概讲一下3个拦截器的基本应用和区别:

3个拦截器的共同点,都是对http请求进行拦截,但是http请求的来源不同:

HandlerInterceptor是最常规的,其拦截的http请求是来自于客户端浏览器之类的,是最常见的http请求拦截器;
ClientHttpRequestInterceptor是对RestTemplate的请求进行拦截的,在项目中直接使用restTemplate.getForObject的时候,会对这种请求进行拦截,经常被称为:RestTempalte拦截器或者Ribbon拦截器;
RequestInterceptor常被称为是Feign拦截器,由于Feign调用底层实际上还是http调用,因此也是一个http拦截器,在项目中使用Feign调用的时候,可以使用此拦截器;

RequestInterceptor

Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加容易。Feign的RequestInterceptor接口是用来拦截请求并进行处理的,可以在请求发送前或发送后对请求进行修改或者添加一些额外的信息。

下面是一个简单的示例代码,演示如何使用Feign的RequestInterceptor接口:

public class MyRequestInterceptor implements RequestInterceptor {
    
    @Override
    public void apply(RequestTemplate template) {
        // 在请求头中添加自定义的信息
        template.header("Authorization", "Bearer my-token");
        
        // 对请求体进行修改
        String requestBody = template.requestBody().asString();
        String modifiedRequestBody = modifyRequestBody(requestBody);
        template.body(modifiedRequestBody);
    }
    
    private String modifyRequestBody(String requestBody) {
        // 对请求体进行修改
        return requestBody;
    }
}

在上面的代码中,我们实现了Feign的RequestInterceptor接口,并重写了其中的apply方法。在apply方法中,我们可以对请求进行各种操作,例如添加请求头信息、修改请求体等。在示例代码中,我们添加了一个名为“Authorization”的请求头信息,并对请求体进行修改。

可以在Feign客户端的构造方法中将RequestInterceptor实例传递给Feign客户端,以便在请求时进行拦截和修改:

MyService myService = Feign.builder()
        .requestInterceptor(new MyRequestInterceptor())
        .target(MyService.class, "http://localhost:8080");

在上面的代码中,我们将MyRequestInterceptor实例传递给Feign客户端的构造方法中,以便在请求时进行拦截和修改。

总之,Feign的RequestInterceptor接口可以帮助我们在发送请求之前或之后对请求进行修改或添加一些额外的信息,从而更加灵活地使用Feign客户端。

ClientHttpRequestInterceptor

ClientHttpRequestInterceptor是一个接口,用于在发送HTTP请求之前或之后拦截请求并进行修改。它可以用于添加、修改或删除请求头、请求参数、请求体等内容,以及在请求完成后处理响应。使用ClientHttpRequestInterceptor可以方便地实现一些常见的功能,例如:

1. 添加认证信息:在每个请求中添加认证信息,例如token或用户名密码。
2. 添加请求头:在每个请求中添加自定义的请求头,例如User-Agent、Referer等。
3. 修改请求参数:在发送请求之前修改请求参数,例如添加时间戳、签名等。
4. 处理响应:在请求完成后处理响应,例如解析响应体、记录日志等。

使用ClientHttpRequestInterceptor需要实现其中的intercept方法,该方法接收两个参数:ClientHttpRequest和byte[],前者表示当前的请求对象,后者表示请求体的字节数组。在intercept方法中可以对请求进行修改,例如添加请求头、修改请求体等。修改后的请求会继续传递给下一个拦截器或发送到服务端。对于响应的处理可以使用ResponseExtractor或自定义的响应处理器。

示例代码:

import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import java.io.IOException;
public class MyInterceptor implements ClientHttpRequestInterceptor {
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        // 在请求发送之前,对请求进行修改或添加一些额外的信息
        request.getHeaders().add("Authorization", "Bearer token123");
        // 执行请求
        ClientHttpResponse response = execution.execute(request, body);
        // 在请求发送之后,对响应进行修改或添加一些额外的信息
        response.getHeaders().add("Cache-Control", "no-cache");
        return response;
    }
}

在上面的示例中,我们实现了ClientHttpRequestInterceptor接口,并重写了intercept方法。在这个方法中,我们首先对请求添加了一个名为Authorization的请求头,然后通过ClientHttpRequestExecution对象的execute方法执行了请求,并得到了响应。最后,我们又对响应添加了一个名为Cache-Control的响应头,并返回了响应。

要使用这个拦截器,可以将它注册到RestTemplate中,如下所示:

import org.springframework.web.client.RestTemplate;
public class MyClient {
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getInterceptors().add(new MyInterceptor());
        // 发送HTTP请求
        String result = restTemplate.getForObject("http://example.com/api", String.class);
        System.out.println(result);
    }
}

在上面的示例中,我们创建了一个RestTemplate对象,并将MyInterceptor拦截器添加到了它的拦截器列表中。然后,我们使用RestTemplate对象发送了一个HTTP GET请求,并打印了响应结果。

总结:

ClientHttpRequestInterceptor是Spring框架中的一个拦截器接口,用于拦截客户端发出的HTTP请求。通过实现这个接口,并将拦截器注册到RestTemplate中,可以对请求进行修改或添加一些额外的信息。

参考博客:https://blog.csdn.net/weixin_41979002/article/details/124778961