Feign如何设置请求头呢?
今天在使用Feign进行微服务之间的调用,出现没有Token的现象,那么如何实现实现微服务调用之间置于token的效果,
使其之间可以自由的访问,下文笔者将讲述具体的设置方式
使其之间可以自由的访问,下文笔者将讲述具体的设置方式
1.定义一个Feign配置类
实现Feign的RequestInterceptor接口
重写其中的apply方法
为RequestTemplate添加请求头信息
2.在Feign调用时,使用其配置类,即可达到Feign请求时
自动添加token信息
例1:
//Feign 配置类1
@Component
public class FeignClientsConfigurationCustom implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// 此种方式是线程安全的
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
// 不为空时取出请求中的header 原封不动的设置到feign请求中
if (null != attributes) {
HttpServletRequest request = attributes.getRequest();
if (null != request) {
// 遍历设置 也可从request取出整个Header 写到RequestTemplate 中
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
requestTemplate.header(name, values);
}
}
}
}
}
}
或
package org.jeecg.config;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.constant.CommonConstant;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
*
* @Description:自定义 Feign 配置信息 添加上下文 token
* @author: Java265.com
* */
@Component
public class FeignClientsConfigurationCustom implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes
= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (null != attributes) {
HttpServletRequest request = attributes.getRequest();
// 将token信息放入header中
String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);
if (token == null || "".equals(token)) {
requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, UserTokenContext.getToken());
}
}
}
}
Feign中使用时,只需加入相应的配置类即可
@FeignClient(name = "testClient", configuration = FeignClientsConfigurationCustom.class)
public interface testServer{
}
Controller中异步调用Feign接口
@Autowired
private TestService testService;
@GetMapping("/test")
public String test(){
//设置线程会话Token
UserTokenContext.setToken(TemporaryTokenUtil.getTemporaryToken());
// 此方法是一个异步方法
//在该方法中调用了Feign服务
//此时方法中会自动加入请求头
testService.testMethod();
//使用完删除Token,避免性能
UserTokenContext.remove();
return "Hello world!";
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


