一、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调用的时候,可以使用此拦截器;
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 {@Overridepublic 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