OpenFeign实现携带请求头方案详细介绍
在使用OpenFeign请求其他服务接口时,默认不携带header信息,这样就导致无法携带登录用户信息。要解决这个问题,下面分两种情况进行处理。
1. 同步请求
对于同步请求,无需另作处理,只需从header中获取token信息,放入新请求即可。
@Configuration public class FeignConfig { @Bean public RequestInterceptor requestInterceptor(){ return new RequestInterceptor() { @Override public void apply(RequestTemplate requestTemplate) { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if(requestAttributes != null){ //获取请求的token信息 String token = requestAttributes.getRequest().getHeader(BaseConstant.TOKEN_HEADER); //同步到请求中 requestTemplate.header(BaseConstant.TOKEN_HEADER,token); return; } } }; } }
2. 异步请求
对于异步请求(例如A线程接到了HTTP请求,然后开启子线程B,B处理完成后调用openfeign接口),是无法使用上述方法的。因为RequestContextHolder.getRequestAttributes()方法获取的requestAttributesHolder变量,是ThreadLocal类型的:
private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal("Request attributes");
所以想到了一个简单的办法,在创建子线程时,将当前线程的token信息传递到子线程中。子线程在调用feign接口前,将token存入当前线程变量中,token类定义以及ThreadLocal定义如下:
//Token类定义 @Data public class TokenInfo implements Serializable { private String token; } //TokenContext类定义 public class TokenContext { public static final ThreadLocal<TokenInfo> tokenInfo = new ThreadLocal<>(); //设置token信息 public static void set(TokenInfo info){ tokenInfo.set(info); } //获取token信息 public static TokenInfo get(){ return tokenInfo.get(); } //移除token信息 public static void remove(){ tokenInfo.remove(); } }
调用接口处理:
TokenInfo info = new TokenInfo(); info.setToken(token); TokenContext.set(info); //调用接口 feign.interface; //一定要记得删除,不然后内存泄露风险 TokenContext.remove();
最后,上述创建的Bean改为:
@Configuration public class FeignConfig { @Bean public RequestInterceptor requestInterceptor(){ return new RequestInterceptor() { @Override public void apply(RequestTemplate requestTemplate) { //老请求 获取当前线程请求的请求信息 ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if(requestAttributes != null){ String token = requestAttributes.getRequest().getHeader(BaseConstant.TOKEN_HEADER); //同步到请求中 requestTemplate.header(BaseConstant.TOKEN_HEADER,token); return; } TokenInfo tokenInfo = TokenContext.get(); if(userInfo != null){ String token = tokenInfo.getToken(); requestTemplate.header(BaseConstant.TOKEN_HEADER,BaseConstant.TOKEN_PREFIX + token); return; } } }; } }
到此这篇关于OpenFeign实现携带请求头方案详细介绍的文章就介绍到这了,更多相关OpenFeign携带请求头内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringCloud客户端报错:- was unable to send&nb
这篇文章主要介绍了SpringCloud客户端报错:- was unable to send heartbeat!的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-05-05mybaties plus实体类设置typeHandler不生效的解决
这篇文章主要介绍了mybaties plus实体类设置typeHandler不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-08-08Java连接MySQL8.0 JDBC的详细步骤(IDEA版本)
这篇文章主要介绍了Java连接MySQL8.0 JDBC的详细步骤(IDEA版本),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-04-04
最新评论