feign远程调用配置原客户端的请求头
在springcloud中的feign中,如果一个模块使用 feign 来调用另一个模块的话,那么在这个调用的过程中,feign客户端请求被调用的模块,但是这个feign客户端发送到请求中不会包含原请求的请求头。
那么被调用模块接受到的feign客户端发送的请求报文中是没有 原请求的请求头信息的。那么如果我们需要使用这个请求头信息的话就需要自己更改一下feign客户端发送到请求报文,把原请求的请求头内容 赋值 给feign发送到请求的请求头中。
实现方法: 定义一个openfeign的拦截器,使用拦截器拦截到openfeign客户端发送的请求报文,然后把原来的请求头 赋值给请求报文。
具体实现方式:
添加一个openfeign拦截器
package com.atguigu.tingshu.interceptor;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* @Description: 该拦截器用来让feign之间的远程调用同样附带原来请求的请求头信息
* @Author lilinghao
* @Date 2025/2/21
**/
// 这里我主要是需要源请求请求头中的token字段的信息,所以这里就只赋值了 token 信息。
@Component
@Slf4j
// 通过让该类来继承 RequestInterceptor 来实现对请求报文的修改等操作
/** RequestInterceptor 是 Feign 提供的一个接口,允许你在发送 HTTP 请求之前对请求进行自定义操作,例如添加请求头、修改请求体、记录日志等。
当有feign客户端发送请求的话,就会自动被 RequestInterceptor 接口的实现类捕捉。
*/
public class FeignInterceptor implements RequestInterceptor {
/** RequestTemplate:是 Feign 中的一个类,表示 HTTP 请求的模板。它包含了请求的 URL、方法、头信息、请求体等内容。
* apply 方法:在每次发送 HTTP 请求之前,Feign 会调用该方法,允许你对请求进行修改或增强。
* 在这段代码中,RequestTemplate 是 Feign 客户端用来构建即将发送给远程服务的 HTTP 请求的模板对象。通过操作 RequestTemplate,您可以修改或添加请求头、请求体、请求方法、请求路径等信息。
/
@Override
public void apply(RequestTemplate requestTemplate) {
// 获取请求对象
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
// 异步编排、MQ消费端的 requestAttributes 会为空
if (null != requestAttributes) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
String token = request.getHeader("token");
requestTemplate.header("token", token);
}
}
}
RequestContextHolder.getRequestAttributes()
获取当前线程的
RequestAttributes
对象,它保存了当前请求的上下文信息。这个方法通常用于同步请求,因为它依赖于线程局部变量(
ThreadLocal
)。
ServletRequestAttributes.getRequest()
从
ServletRequestAttributes
中获取当前的HttpServletRequest
对象,它包含了当前请求的所有信息(如请求头、请求体、路径参数等)。
request.getHeaderNames()
获取当前请求的所有请求头名称。
requestTemplate.header(headerName, headerValue)
将当前请求的请求头信息添加到 Feign 的
RequestTemplate
中。这样,Feign 在发起远程调用时,会携带这些请求头信息。
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
寻梦!
喜欢就支持一下吧