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!"; }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。